首页 文章

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

提问于
浏览
0

我使用Sklearn决策树进行分类,我有两种类型的数据:分类和连续 . 我使用了 pd.get_dummies 作为我的分类值,最终得到了90多个功能 . 当然,这是非常多的 .
问题是我然后迭代 max_features 参数以获得我的模型的最佳分数,并且具有超过20个特征太耗时 . 所以我认为Sklearn可以使用稀疏矩阵来表示我的分类特征,而不是使用0和1的70列 .

问题是:Sklearn可以使用稀疏matricies和常规数组的组合吗?如果是的话 - 我该怎么做?目前我收到错误: 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

    当你这样做时:

    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])
    

    现在你可以进一步传递这个 .

相关问题