Scikit和线性代数/机器学习的新手一般都可以使用Python,因此我似乎无法解决以下内容:
我有一个训练集和一个测试集,其中包含连续和离散值。CSV文件被加载到PANDAS DataFrames中,形状匹配,为(1460,81)和(1459,81)。但是,在使用pandas的get_dummies之后,数据框的形状更改为(1460,306)和(1459,294)。因此,当我使用Scikit线性回归模块进行线性回归时,它会为306个变量构建一个模型,并且尝试仅使用294个变量进行预测。然后,这自然会导致以下错误:
ValueError: shapes (1459,294) and (306,1) not aligned: 294 (dim 1) != 306 (dim 0)
我如何解决这样的问题?我可以以某种方式重塑(1459,294)以匹配另一个吗?
谢谢,我希望我已经清楚了:)
这是一个非常普遍的问题,当处理分类数据时。关于如何最好地处理这一点有不同的意见。
一种可能的方法是将功能应用于限制一组可能选项的分类功能。例如,如果您的功能包含字母的字母,则可以编码A,B,C,D和"其他/未知"的功能。通过这种方式,您可以在测试时间应用相同的功能,并从问题中抽象。当然,一个明确的缺点是,通过减少特征空间,您可能会失去有意义的信息。
另一种方法是在您的培训数据上建立模型,无论是自然创建的假人,并将其视为模型的基准。当您在测试时预测模型时,您会以相同的方式转换训练数据的测试数据。例如,如果您的训练集在功能中具有字母的字母,并且测试集中的相同功能包含" AA"的值,那么您会忽略这一点。这是您当前情况的相反,但前提是相同的。您需要即时创建缺失的功能。当然,这种方法也有缺点。
第二种方法是您在问题中提到的,所以我将使用pandas
进行。
使用get_dummies
,您将分类功能编码为多个单热编码功能。您可以使用reindex
迫使测试数据匹配培训数据:
test_encoded = pd.get_dummies(test_data, columns=['your columns'])
test_encoded_for_model = test_encoded.reindex(columns = training_encoded.columns,
fill_value=0)
这将以与培训数据相同的方式编码测试数据,填写0的虚拟功能,这些功能不是通过编码测试数据而创建的,而是在培训过程中创建的。
。您可以将其包裹到一个函数中,然后即时将其应用于测试数据。如果您创建数组或列名称的列表,则不需要内存中的编码培训数据(我使用training_encoded.columns
访问)。
对任何有兴趣的人:我最终合并了火车和测试集,然后生成假人,然后以完全相同的分数再次分配数据。这样,由于生成完全相同的虚拟数据,因此没有任何不同形状的问题。
这对我有用:
最初,我收到此错误消息:
shapes (15754,3) and (4, ) not aligned
我发现,我正在使用 3 变量在火车数据中创建模型。但是我添加常数X_train = sm.add_constant(X_train)
会自动创建常数变量。因此,现在总共有 4 变量。
当您默认测试此模型时,测试变量具有 3 变量。因此,该错误会因维度失误匹配而弹出。
因此,我使用了为y_test创建虚拟变量的技巧。
`X_test = sm.add_constant(X_test)`
尽管这是一个无用的变量,但是这解决了所有问题。