Python 如何重塑测试数据帧,使其维度与训练和预测工作中使用的维度相同?

Python 如何重塑测试数据帧,使其维度与训练和预测工作中使用的维度相同?,python,scikit-learn,linear-regression,predict,one-hot-encoding,Python,Scikit Learn,Linear Regression,Predict,One Hot Encoding,需要知道需要做哪些更改,以便测试数据将具有与预测训练相同的编码列级别。它现在由于维度错误而失败 已在论坛中查看类似查询 import pandas as pd import sklearn from sklearn.linear_model import LinearRegression # initialize list of lists data = [[1001, 10,'Male',38], [2001, 15,'Male',50], [2004, 12,'FeMale',40]]

需要知道需要做哪些更改,以便测试数据将具有与预测训练相同的编码列级别。它现在由于维度错误而失败

已在论坛中查看类似查询

import pandas as pd
import sklearn
from sklearn.linear_model import LinearRegression
# initialize list of lists 
data = [[1001, 10,'Male',38], [2001, 15,'Male',50], [2004, 12,'FeMale',40]] 

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['StudentId', 'Age','Gender','Weight']) 

#Define y , X, test and train

y=df['Weight']
X=df[['StudentId','Age','Gender']] 
# One-hot encode the data using pandas get_dummies
X = pd.get_dummies(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=66)

X_test.head()
----
StudentId   Age Gender_FeMale   Gender_Male
1   2001    15  0   1
---
# linear regression model creation
lm_model = LinearRegression()
lm_model.fit(X_train,y_train)

# predictions
lm_model.predict(X_test)

---works fine till now..--
When we now create a single test record and test it fails as the dimension mismatch happens,,, Does one have to manually add another encoded dimension or some clean approach is there...please advice..

sample_testdata=[[4001, 10,'FeMale']]
# Create the pandas DataFrame 
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender']) 

sample_testDF_encoded=pd.get_dummies(sample_testDF)
-----
    StudentId   Age Gender_FeMale
0   4001    10  1

---

lm_model.predict(sample_testDF_encoded)

--Error----

ValueError: shapes (1,3) and (4,) not aligned: 3 (dim 1) != 4 (dim 0)
单一测试记录的预测失败,因为get_假人产生一个列

print(X_train.columns)
这将产生:

Index(['StudentId', 'Age', 'Gender_FeMale', 'Gender_Male'], dtype='object')

print(sample_testDF_encoded.columns)
这将产生:

Index(['StudentId', 'Age', 'Gender_FeMale'], dtype='object')
因此,问题在于,您的one hot编码器在主数据中为性别制作了两列,其中性别值为男性或女性(如果您的数据包含女性,则将性别编码为1;如果您的数据包含男性,则将性别编码为1) 但是您的示例_testDF只包含一个女性值。所以,一个热编码器这次不会为性别制作两列。所以这是一场错过的比赛

因此,您的测试数据应该如下所示:

sample_testdata=[[4001, 10,1, 0]]
# Create the pandas DataFrame 
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender_FeMale', 'Gender_Male']) 
更改这些拖曳线将消除错误并给出预测结果

正如你在评论中所说,样本数据是由用户输入的,所以你必须按照我在评论中的回复进行转换。您可以创建转换后的数据列表,而不是使用该转换后的列表生成Dataframe:

sample_testdata= [[4001, 10,'FeMale']]

convertedDataList = []
for data in sample_testdata:
    if data[2] == 'FeMale':
        data[2] = 1
        data.append(0)
    else:
        data[2] = 0
        data.append(1) 
    convertedDataList.append(data)


# Create the pandas DataFrame  using convertedDataList
sample_testDF= pd.DataFrame(convertedDataList, columns = ['StudentId', 'Age','Gender_FeMale', 'Gender_Male']) 

您收到此错误是因为

sample_testdata=[[4001, 10,'FeMale']]
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender']) 
sample_testDF_encoded=pd.get_dummies(sample_testDF)
gives the output :
 StudentId     Age    Gender_FeMale
    4001        10      1
但是您的测试用例需要有一个以上的列Gender\u-Male,因为您的trainig数据集有Gender\u-Male列,所以这个列在这里给出了列不匹配 因此,您需要执行以下任一选项:

sample_testdata=[[4001, 10,'FeMale'],[4001, 10,'Male']]
OR
sample_testDF= pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender_FeMale', 'Gender_Male'])
这个给了我以下输出:

sample_testdata=[[4001, 10,'FeMale'],[4001, 10,'Male']]
lm_model.predict(sample_testDF_encoded)
array([43.98202214, 43.98201816])

为了获得更好的用户体验,您可以添加多个类别,并在用户输入之后和使用一个热编码/获取虚拟对象之前将其转换为变量。比如:

# Sample input from user
sample_testdata = [[4001, 10,'FeMale']]
sample_testDF = pd.DataFrame(sample_testdata, columns = ['StudentId', 'Age','Gender'])

# Add categories and convert to categorical variable
sample_testDF['Gender'] = pd.Categorical(sample_testDF['Gender'], 
                                         categories = ["Male", "FeMale"])

# Create dummies and index columns based on your X_test/ X_train
sample_testDF_dum = pd.get_dummies(sample_testDF)[X_test.columns]
sample_testDF_dum

#    StudentId  Age Gender_FeMale   Gender_Male
# 0       4001  10  1               0

您需要通过一个带有多条记录的
示例测试数据
,每个类别至少应包括一条记录(男性/女性),以便
让假人
工作。感谢您的时间。那是一个骇客。示例测试数据由用户提供。我不想强迫用户写出培训中使用的所有可能级别的分类值。还有其他想法吗..在下面添加了一个备选答案。谢谢您的时间。那是一个骇客。示例测试数据由用户提供。我不想强迫用户编写培训中使用的所有可能级别的分类值。还有其他想法吗..不需要强迫用户做任何事情,如果用户输入为[4001,10,'FeMale',则将其转换为[4001,10,1,0],如果用户输入为[4001,10,'femal',则将其转换为[4001,10,0,1]我已经编辑了我的答案,并添加了如何将用户输入转换为回归模型所需的格式感谢您的时间。那是一个骇客。示例测试数据由用户提供。我不想强迫用户编写培训中使用的所有可能级别的分类值。还有其他想法吗。。