一般来说,SciKit和线性代数/机器学习相当新,所以我似乎无法解决以下问题:
我有一套训练集和一组测试数据,包含连续和离散/分类值。 CSV文件加载到Pandas DataFrames中并匹配形状,即(1460,81)和(1459,81)。 但是,使用Pandas' get_dummies后,DataFrame的形状将更改为(1460,306)和(1459,294)。因此,当我使用SciKit Linear Regression模块进行线性回归时,它会为306个变量构建一个模型,并尝试使用它来预测一个只有294个变量的模型。这自然会导致以下错误:
ValueError: shapes (1459,294) and (306,1) not aligned: 294 (dim 1) != 306 (dim 0)
我怎么能解决这个问题?我可以以某种方式重塑(1459年,294年)以匹配另一个吗?
谢谢,我希望我已经明确表示:)
答案 0 :(得分:6)
在处理分类数据时,这是一个非常常见的问题。关于如何最好地处理这个问题,有不同的意见。
一种可能的方法是将函数应用于限制可能选项集的分类特征。例如,如果您的要素包含字母表中的字母,则可以对A,B,C,D和'其他/未知'的要素进行编码。通过这种方式,您可以在测试时应用相同的函数并从问题中抽象出来。当然,一个明显的缺点是,通过减少特征空间,您可能会丢失有意义的信息。
另一种方法是在训练数据上建立一个模型,使用自然创建的假人,并将其视为模型的基线。当您在测试时使用模型进行预测时,您将以与转换训练数据相同的方式转换测试数据。例如,如果您的训练集在要素中具有字母表的字母,并且测试集中的相同要素包含“AA'”的值,则在进行预测时将忽略该值。这与你目前的情况相反,但前提是一样的。您需要动态创建缺少的功能。当然,这种方法也有缺点。
第二种方法就是你在问题中提到的,所以我会用http://www.springframework.org/schema/security/spring-security-4.1.xsd
来完成它。
通过使用pandas
,您可以将分类功能编码为多个单热编码功能。您可以做的是使用get_dummies
强制您的测试数据与您的训练数据相匹配,如下所示:
reindex
这将以与训练数据相同的方式对测试数据进行编码,对于通过编码测试数据但在训练过程中创建的虚拟特征填写为0。
您可以将其包装到一个函数中,并将其应用于您的测试数据。如果您创建数组或列名列表,则不需要在内存中编码的训练数据(我使用test_encoded = pd.get_dummies(test_data, columns=['your columns'])
test_encoded_for_model = test_encoded.reindex(columns = training_encoded.columns,
fill_value=0)
访问)。
答案 1 :(得分:1)
对于任何感兴趣的人:我最终合并了火车和测试装置,然后生成假人,然后再次以完全相同的分数分割数据。这样就不再有不同形状的问题了,因为它生成了完全相同的虚拟数据。
答案 2 :(得分:0)
这对我有用:
最初,我收到此错误消息:
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)`
虽然这是一个无用的变量,但这解决了所有问题。