Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何预测特性的数量是否与测试集中可用特性的数量不匹配?_Python_Pandas_Machine Learning_Categorical Data_Supervised Learning - Fatal编程技术网

Python 如何预测特性的数量是否与测试集中可用特性的数量不匹配?

Python 如何预测特性的数量是否与测试集中可用特性的数量不匹配?,python,pandas,machine-learning,categorical-data,supervised-learning,Python,Pandas,Machine Learning,Categorical Data,Supervised Learning,我使用pandasget_dummies将分类变量转换为虚拟/指标变量,它在数据集中引入了新功能。然后,我们将该数据集拟合/训练到一个模型中 由于X_列和X_测试的维度保持不变,因此当我们对测试数据进行预测时,它与测试数据X_测试配合良好 现在让我们假设在另一个csv文件中有测试数据(输出未知)。当我们使用get_dummies转换这组测试数据时,生成的数据集可能与我们训练模型时的特征数量不同。后来,当我们将我们的模型用于此数据集时,它失败了,因为测试集中的特性数量与模型的不匹配 知道我们怎么处

我使用pandas
get_dummies
将分类变量转换为虚拟/指标变量,它在数据集中引入了新功能。然后,我们将该数据集拟合/训练到一个模型中

由于
X_列
X_测试
的维度保持不变,因此当我们对测试数据进行预测时,它与测试数据
X_测试
配合良好

现在让我们假设在另一个csv文件中有测试数据(输出未知)。当我们使用
get_dummies
转换这组测试数据时,生成的数据集可能与我们训练模型时的特征数量不同。后来,当我们将我们的模型用于此数据集时,它失败了,因为测试集中的特性数量与模型的不匹配

知道我们怎么处理吗

代码:

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

# Load the dataset
in_file = 'train.csv'
full_data = pd.read_csv(in_file)
outcomes = full_data['Survived']
features_raw = full_data.drop('Survived', axis = 1)
features = pd.get_dummies(features_raw)
features = features.fillna(0.0)
X_train, X_test, y_train, y_test = train_test_split(features, outcomes, 
test_size=0.2, random_state=42)
model = 
DecisionTreeClassifier(max_depth=50,min_samples_leaf=6,min_samples_split=2)
model.fit(X_train,y_train)

y_train_pred = model.predict(X_train)
#print (X_train.shape)
y_test_pred = model.predict(X_test)


from sklearn.metrics import accuracy_score
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)
print('The training accuracy is', train_accuracy)
print('The test accuracy is', test_accuracy)

# DOing again to test another set of data
test_data = 'test.csv'
test_data1 = pd.read_csv(test_data)

test_data2 = pd.get_dummies(test_data1)
test_data3 = test_data2.fillna(0.0)
print(test_data2.shape)
print (model.predict(test_data3))

似乎以前也有人问过类似的问题,但最有效/最简单的方法是遵循所描述的方法

还值得注意的是,您的模型只能使用其训练过的功能,因此,如果X_test vs X_train中有其他列,而不是更少,则必须在预测之前删除这些列

# Get missing columns in the training test
missing_cols = set( X_train.columns ) - set( X_test.columns )
# Add a missing column in test set with default value equal to 0
for c in missing_cols:
    X_test[c] = 0
# Ensure the order of column in the test set is in the same order than in train set
X_test = X_test[X_train.columns]