值错误:使用序列数据预处理设置数组元素

问题描述

dataset = pd.read_csv('train_data.csv')
X = dataset.iloc[:,1:-1].values
y = dataset.iloc[:,-1].values
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder',OneHotEncoder(),[0,1,2,3,4,5,6,7,8,9,10,11,12])],remainder='passthrough')
X = np.array(ct.fit_transform(X))
from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 10,random_state = 0)
regressor.fit(X,y)                 #Error is thrown here

TypeError Traceback(最近一次调用最后一次) 类型错误:float() 参数必须是字符串或数字,而不是 'csr_matrix'

上述异常是以下异常的直接原因: ValueError 回溯(最近一次调用) ValueError: 使用序列设置数组元素。

解决方法

您的错误来自此 np.array(ct.fit_transform(X)) 。从一个 hot 你得到一个稀疏矩阵(类型 csr),你不需要再次把它放在一个 numpy 数组中。您可以使用以下方法将其转换为密集:

ct.fit_transform(X).todense()

但这可能会占用大量内存并且是不必要的,因为回归器可以采用稀疏矩阵。你可以简单地传入它,我在下面用一个示例数据集来说明:

dataset = pd.DataFrame(np.random.choice(['A','B','C'],(50,13)),columns=["v"+ str(i) for i in range(13)])
dataset['v14'] = np.random.uniform(0,1,50)
dataset['y'] = np.random.normal(0,50)

X = dataset.iloc[:,1:-1].values
y = dataset.iloc[:,-1].values
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder',OneHotEncoder(),[0,2,3,4,5,6,7,8,9,10,11,12])],remainder='passthrough')

我们现在变换 X,保持稀疏:

X = ct.fit_transform(X)
type(X)
scipy.sparse.csr.csr_matrix

然后回归:

from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 10,random_state = 0)
regressor.fit(X,y)

以上不会报错