scikit-learn训练时出错:无法分配具有形状的数组

时间:2020-08-20 05:04:48

标签: python numpy scikit-learn

我有以下几列:Col1:字符串,Col2:浮动,Col3:浮动。在预测期间,我要预测Col3的值:

import pickle
import numpy as np

from sklearn import model_selection
from sklearn import linear_model
from sklearn.preprocessing import OneHotEncoder
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler

x_columns_to_encode = ['Col1']
x_columns_to_scale  = ['Col2']
y_columns_to_scale = ['Col3']

# Instantiate encoder/scaler
scaler = StandardScaler()
ohe = OneHotEncoder(sparse=False)
    
# Scale and Encode Separate Columns
x_scaled_columns = scaler.fit_transform(df1[x_columns_to_scale]) 
x_encoded_columns = ohe.fit_transform(df1[x_columns_to_encode])
y_scaled_columns = scaler.fit_transform(df1[y_columns_to_scale])
    
df = np.concatenate([x_scaled_columns, x_encoded_columns], axis=1)

validation_size = 0.50
seed = 7
x_train, x_validation, y_train, y_validation = model_selection.train_test_split(df, y_scaled_columns, test_size=validation_size, random_state=seed)
bestScore = 0.0
model = linear_model.LinearRegression()
score = model.fit(x_train, y_train).score(x_validation, y_validation)
print(score)

运行此代码时出现错误:

“无法分配形状为(2763330,25380)和数据类型为float64的数组”

有人可以帮助我了解我在哪里犯错吗?

1 个答案:

答案 0 :(得分:0)

一种热编码会为分类列中的每个唯一类生成一个新列。如果您的分类列中的唯一类过多,则可能会耗尽内存。

这可能有助于向我们展示您的数据,因此我们可以提供更好的建议。

在此期间,您可以尝试以下选项:

  • 为一个热编码矩阵使用稀疏表示。由于一个热编码矩阵具有许多为0的条目,因此可以节省大量空间。
  • 使用标签编码。但是,请小心,因为标签编码假定类之间存在序数关系。如果类之间没有序数关系,最好使用基于树的模型,因为它们不使用数学方程式建立模型,因此在决策树进行拆分时序数关系不相关。 请参阅this以获得清晰的解释。
  • 对某些类进行逻辑分组。例如,假设您的分类列具有“ tiger”,“ lion”和“ cheetah”类,则可以将它们在逻辑上归为一类,例如“ big_cats”。这将减少唯一类的数量,因此添加的新列的数量也将减少。
  • 完全丢弃分类列。