我一直在使用panda的get_dummies函数来生成用于scikit-learn的分类变量的虚拟列,但注意到它有时无法按我预期的那样工作。
先决条件
import pandas as pd
import numpy as np
from sklearn import linear_model
从sklearn导入大熊猫作为pd导入numpy作为np
假设我们有以下训练和测试集:
训练集
train = pd.DataFrame({"letter":["A", "B", "C", "D"], "value": [1, 2, 3, 4]})
X_train = train.drop(["value"], axis=1)
X_train = pd.get_dummies(X_train)
y_train = train["value"]
train = pd.DataFrame({“字母”:[“ A”,“ B”,“ C”,“ D”],“值”:[1、2、3、4]})X_train = train.drop( [“值”],轴= 1)X_train = pd.get_dummies(X_train)y_train =火车[“ value”]
测试集
test = pd.DataFrame({"letter":["D", "D", "B", "E"], "value": [4, 5, 7, 19]})
X_test = test.drop(["value"], axis=1)
X_test = pd.get_dummies(X_test)
y_test = test["value"]
测试= pd.DataFrame({“字母”:[“ D”,“ D”,“ B”,“ E”],“值”:[4、5、7、19]})X_test = test.drop( [“ value”],轴= 1)X_test = pd.get_dummies(X_test)y_test = test [“ value”]
现在说我们想在训练集中训练线性模型,然后用它来预测测试集中的值:
训练模型
lr = linear_model.LinearRegression()
model = lr.fit(X_train, y_train)
测试模型
model.score(X_test, y_test)
ValueError: shapes (4,3) and (4,) not aligned: 3 (dim 1) != 4 (dim 0)
嗯,这没有计划。 如果我们打印X_train和X_test ,可能会帮助您了解一些信息:
检查训练/测试数据集
print(X_train)
letter_A letter_B letter_C letter_D
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
print(X_test)
letter_B letter_D letter_E
0 0 1 0
1 0 1 0
2 1 0 0
3 0 0 1
实际上,它们确实具有不同的形状和某些不同的列名,因为测试集包含一些训练集中不存在的值。
我们可以通过在数据帧上运行get_dummies方法之前将“字母”字段分类来解决此问题。 目前,该字段的类型为“对象”:
列类型
print(train.info)
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
letter 4 non-null object
value 4 non-null int64
dtypes: int64(1), object(1)
memory usage: 144.0+ bytes
我们可以通过将“字母”字段转换为“类别”类型并将允许值列表设置为训练/测试集中唯一的一组值来解决此问题。
所有允许的值
all_data = pd.concat((train,test))
for column in all_data.select_dtypes(include=[np.object]).columns:
print(column, all_data[column].unique())
letter ['A' 'B' 'C' 'D' 'E']
现在,让我们更新训练和测试数据框中的“字母”字段的类型。
类型:“类别”
all_data = pd.concat((train,test))
for column in all_data.select_dtypes(include=[np.object]).columns:
train[column] = train[column].astype('category', categories = all_data[column].unique())
test[column] = test[column].astype('category', categories = all_data[column].unique())
现在,如果我们在任一数据帧上调用get_dummies ,我们将获得相同的列集:
get_dummies:拿2
X_train = train.drop(["value"], axis=1)
X_train = pd.get_dummies(X_train)
print(X_train)
letter_A letter_B letter_C letter_D letter_E
0 1 0 0 0 0
1 0 1 0 0 0
2 0 0 1 0 0
3 0 0 0 1 0
X_test = test.drop(["value"], axis=1)
X_test = pd.get_dummies(X_test)
print(X_train)
letter_A letter_B letter_C letter_D letter_E
0 0 0 0 1 0
1 0 0 0 1 0
2 0 1 0 0 0
3 0 0 0 0 1
大! 现在,我们应该能够训练我们的模型并将其用于测试集:
训练模型:乘2
lr = linear_model.LinearRegression()
model = lr.fit(X_train, y_train)
测试模型:取2
model.score(X_test, y_test)
-1.0604490500863557
我们完成了!
翻译自: https://www.javacodegeeks.com/2017/07/pandasscikit-learn-get_dummies-testtrain-sets-valueerror-shapes-not-aligned.html