问题描述
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)
以上不会报错