Sklearn决策树-同时使用稀疏矩阵和其他特征

时间:2018-12-10 11:21:26

标签: python pandas scikit-learn sparse-matrix

我正在使用Sklearn决策树进行某种分类,并且我有两种类型的数据:分类数据和连续数据。我使用pd.get_dummies作为分类值,最终得到90多个功能。当然很多。
关键是我然后遍历max_features参数以获得模型的最佳分数,而拥有20多个功能太费时了。因此,我认为Sklearn可以将稀疏矩阵用于我的分类特征,而不是使用70列(0和1)。

问题是:Sklearn可以混合使用稀疏矩阵和规则数组吗?如果是,我该怎么做?目前,我收到错误消息:setting an array element with a sequence

这里有一些代码可以理解这个想法。 df_with_dummies是我目前使用的,但我希望有一种使用df_with_sparse

的方法
import numpy as np
import pandas as pd 
from scipy.sparse import csr_matrix

a = np.random.randn(10,3)
b = np.random.random((10,1))
df = pd.DataFrame(a, columns = "A B C".split())
df['temp'] = b
df['dum1'] = np.where(df.temp < 0.5, 1, 0)
df['dum2'] = np.where(df.temp >= 0.5, 1, 0)
del df['temp']
df_with_dummies = df.copy()

a = df[['dum1', 'dum2']]
dums = csr_matrix(a)
df['dums'] = dums
df_with_sparse = df.copy()

1 个答案:

答案 0 :(得分:0)

当您这样做:

df['dums'] = dums

dums是稀疏矩阵,pandas DataFrame不能正确处理它,并将其广播到每一行。 pandas对此并不抱怨,因为它认为稀疏矩阵是一个非数组对象。

这意味着df['dums']列中的每个元素都将指向整个稀疏矩阵dums。因此,从本质上讲,每个数组元素都设置有一个数组,因此在scikit-learn估计器中处理该数组时会出现错误setting an array element with a sequence

为此,您可以这样做:

from scipy.sparse import hstack
df_with_sparse = hstack([df[['A', 'B', 'C']].values, dums])

现在您可以将其进一步传递了。