【发布时间】:2020-02-11 14:02:22
【问题描述】:
我有一个如下数据集:
| "Consignor Code" | "Consignee Code" | "Origin" | "Destination" | "Carrier Code" |
|------------------|------------------|----------|---------------|----------------|
| "6402106844" | "66903717" | "DKCPH" | "CNPVG" | "6402746387" |
| "6402106844" | "66903717" | "DKCPH" | "CNPVG" | "6402746387" |
| "6402106844" | "6404814143" | "DKCPH" | "CNPVG" | "6402746387" |
| "6402107662" | "66974631" | "DKCPH" | "VNSGN" | "6402746393" |
| "6402107662" | "6404518090" | "DKCPH" | "THBKK" | "6402746393" |
| "6402107662" | "6404518090" | "DKBLL" | "THBKK" | "6402746393" |
| "6408507648" | "6403601344" | "DKCPH" | "USTPA" | "66565231" |
我正在尝试在其上构建我的第一个 ML 模型。为此,我正在使用 scikit-learn。这是我的代码:
#Import the dependencies
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.externals import joblib
from sklearn import preprocessing
import pandas as pd
#Import the dataset (A CSV file)
dataset = pd.read_csv('shipments.csv', header=0, skip_blank_lines=True)
#Drop any rows containing NaN values
dataset.dropna(subset=['Consignor Code', 'Consignee Code',
'Origin', 'Destination', 'Carrier Code'], inplace=True)
#Convert the numeric only cells to strings
dataset['Consignor Code'] = dataset['Consignor Code'].astype('int64')
dataset['Consignee Code'] = dataset['Consignee Code'].astype('int64')
dataset['Carrier Code'] = dataset['Carrier Code'].astype('int64')
#Define our target (What we want to be able to predict)
target = dataset.pop('Destination')
#Convert all our data to numeric values, so we can use the .fit function.
#For that, we use LabelEncoder
le = preprocessing.LabelEncoder()
target = le.fit_transform(list(target))
dataset['Origin'] = le.fit_transform(list(dataset['Origin']))
dataset['Consignor Code'] = le.fit_transform(list(dataset['Consignor Code']))
dataset['Consignee Code'] = le.fit_transform(list(dataset['Consignee Code']))
dataset['Carrier Code'] = le.fit_transform(list(dataset['Carrier Code']))
#Prepare the dataset.
X_train, X_test, y_train, y_test = train_test_split(
dataset, target, test_size=0.3, random_state=0)
#Prepare the model and .fit it.
model = RandomForestClassifier()
model.fit(X_train, y_train)
#Make a prediction on the test set.
predictions = model.predict(X_test)
#Print the accuracy score.
print("Accuracy score: {}".format(accuracy_score(y_test, predictions)))
现在上面的代码返回:
Accuracy score: 0.7172413793103448
现在我的问题可能很愚蠢 - 但我如何使用我的 model 来实际向我展示它对新数据的预测?
考虑下面的新输入,我希望它预测Destination:
"6408507648","6403601344","DKCPH","","66565231"
如何使用这些数据查询我的模型并得到预测的Destination?
【问题讨论】:
-
只需像在
X_test上所做的那样,就新数据调用model.predict。X_test的结构应该与任何新数据相同。 -
顺便说一句-您应该将标签编码器和任何其他类似的预处理放入pipeline。在拆分数据之前进行这样的预处理是一个严重的错误。
-
我怀疑它会起作用。由于
fit_transform(),编码器会遇到一些问题。另外,我发现你用 4 个变量训练数据很奇怪,但你的输入包含 5 个。 -
使用
fit_transforms()使编码器适合传递的数据集,然后进行转换。如果您需要对新值(输入)进行编码,它将适合新数据,并且与训练模型的值不匹配。您应该为每个变量安装不同的编码器实例,然后transform这样您就可以使用相同的编码transform新数据(您想用来预测)。 -
这就是我对@oliverbj 上面的评论的意思
标签: python machine-learning scikit-learn