熊猫/ scikit学习:get_dummies测试/训练集– ValueError:形状未对齐

我一直在使用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_trainX_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

你可能感兴趣的:(机器学习,python,深度学习,tensorflow,人工智能)