一般来说,SciKit 和 Python 的线性代数/机器学习相当新,所以我似乎无法解决以下问题:
我有一个训练集和一个测试数据集,其中包含连续值和离散/分类值。 CSV 文件被加载到 Pandas DataFrame 中并匹配形状,分别为 (1460,81) 和 (1459,81)。
然而,使用后熊猫的 get_dummies http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html,DataFrame 的形状变为 (1460, 306) 和 (1459, 294)。所以,当我用SciKit 线性回归 http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html模块中,它为 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
您正在将分类特征编码为多个 one-hot 编码特征。您可以做的是通过使用强制您的测试数据与您的训练数据相匹配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
) 如果您创建列名称的数组或列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)