如何使用scikit-learn进行预测
一旦你在scikit-learn中选择并适合最终的机器学习模型,你就可以使用它来预测新的数据实例。
在初学者中,有一些关于如何确切地做到这一点的困惑。我经常看到这样的问题:
我如何在scikit-learn中使用我的模型进行预测?
在本教程中,你将确切地了解如何使用scikit-learn Python库中的最终机器学习模型进行分类和回归预测。
完成本教程后,你将了解:
- 如何最终确定模型,以便为进行预测做好准备。
- 如何在scikit-learn工具包中进行类和概率预测。
- 如何在scikit-learn包中进行回归预测。
我们开始吧。
教程概述
本教程分为3个部分,它们是:
- 首先完成你的模型。
- 如何使用分类模型进行预测。
- 如何用回归模型进行预测。
1.首先确定你的模型
在你做出预测之前,你必须训练一个最终的模型。
你可能已经使用数据的k-fold交叉验证或训练/测试拆分对模型进行了训练。这样做是为了让你估计模型在样本外数据(例如新数据)上的技能。
这些模型已经达到了它们的目的,现在可以丢弃了。
现在,你必须根据所有可用的数据训练最终模型。
你可以在此处了解有关如何培训最终模型的更多信息:
2.如何使用分类模型进行预测
分类问题是模型学习输入特征和作为标签的输出特征(如“垃圾邮件”和“非垃圾邮件”)之间的映射的问题。
下面是一个简单的二进制分类问题的最终Logistic回归模型的示例代码。
虽然我们在本教程中使用的是Logistic回归,但在scikit-learn中的几乎所有分类算法上都有相同的函数可用。
# example of training a final classification model from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_blobs # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) # fit final model model = LogisticRegression() model.fit(X, y)
在最终确定模型后,你可能希望将模型保存到文件,例如通过pickle。保存后,你可以随时加载模型并使用它进行预测。有关这方面的示例,请参阅帖子:
为简单起见,对于本教程中的示例,我们将跳过此步骤。
对于我们最终的模型,我们可能希望做出两种类型的分类预测;它们是类别预测和概率预测。
类型预测
类型预测是:给定最终的模型和一个或多个数据实例,预测数据实例的类型。
我们不知道新数据的结果类型。这就是我们首先需要模型的原因。
我们可以使用scikit-learn中使用recast()函数的最终分类模型来预测类型中的新数据实例。
例如,我们在名为Xnew的数组中有一个或多个数据实例。这可以传递给我们模型上的predict()函数,以便预测数组中每个实例的类值。
Xnew = [[...], [...]] ynew = model.predict(Xnew)
多类预测
让我们用一个同时预测多个数据实例的例子来具体说明这一点。
# example of training a final classification model from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_blobs # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) # fit final model model = LogisticRegression() model.fit(X, y) # new instances where we do not know the answer Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1) # make a prediction ynew = model.predict(Xnew) # show the inputs and predicted outputs for i in range(len(Xnew)): print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
运行该示例将预测三个新数据实例的类型,然后将数据和预测一起打印。
X=[-0.79415228 2.10495117], Predicted=0 X=[-8.25290074 -4.71455545], Predicted=1 X=[-2.18773166 3.33352125], Predicted=0
单类预测
如果只有一个新数据实例,则可以将其作为数组包装的实例提供给recast()函数;例如:
# example of making a single class prediction from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_blobs # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) # fit final model model = LogisticRegression() model.fit(X, y) # define one new instance Xnew = [[-0.79415228, 2.10495117]] # make a prediction ynew = model.predict(Xnew) print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))
运行该示例将打印单个实例和预测的类型。
X=[-0.79415228, 2.10495117], Predicted=0
关于类型标签的注意事项
当你准备数据时,你将已经将域中的类值(如字符串)映射到整数值。你可能使用过LabelEncoding。
此LabelEncoding可用于通过inverse_transform()函数将整数转换回字符串值。
因此,你可能希望在拟合最终模型时保存(pickle)用于编码y值的LabelEncoding。
概率预测
你可能希望进行的另一种预测是数据实例属于每个类型的概率。
这称为概率预测,在给定新实例的情况下,模型将每个结果类型的概率作为介于0和1之间的值返回。
你可以通过调用recast_proba()函数在scikit-learn中进行以下类型的预测,例如:
Xnew = [[...], [...]] ynew = model.predict_proba(Xnew)
此函数仅在那些能够进行概率预测的分类模型上可用,这些分类模型是大多数(但不是全部)模型。
下面的示例对Xnew数据实例数组中的每个示例进行概率预测。
# example of making multiple probability predictions from sklearn.linear_model import LogisticRegression from sklearn.datasets import make_blobs # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) # fit final model model = LogisticRegression() model.fit(X, y) # new instances where we do not know the answer Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1) # make a prediction ynew = model.predict_proba(Xnew) # show the inputs and predicted probabilities for i in range(len(Xnew)): print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
运行实例进行概率预测,然后打印输入数据实例以及属于第一类和第二类(0和1)的每个实例的概率。
X=[-0.79415228 2.10495117], Predicted=[0.94556472 0.05443528] X=[-8.25290074 -4.71455545], Predicted=[3.60980873e-04 9.99639019e-01] X=[-2.18773166 3.33352125], Predicted=[0.98437415 0.01562585]
如果你想要向用户显示概率以供专家解释,这在你的应用程序中可能会很有帮助。
3.如何运用回归模型进行预测
回归是一个有监督的学习问题,在给定输入示例的情况下,模型学习到适当输出量的映射,例如“0.1”和“0.2”等。
下面是一个最终的线性回归模型的示例。同样,所展示的用于进行回归预测的功能适用于scikit-learn中提供的所有回归模型。
# example of training a final regression model from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression # generate regression dataset X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1) # fit final model model = LinearRegression() model.fit(X, y)
我们可以通过对最终模型调用recast()函数来预测最终回归模型的数量。
与分类一样,predict()函数接受一个或多个数据实例的列表或数组。
多元回归预测
下面的示例演示了如何对具有未知预期结果的多个数据实例进行回归预测。
# example of training a final regression model from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression # generate regression dataset X, y = make_regression(n_samples=100, n_features=2, noise=0.1) # fit final model model = LinearRegression() model.fit(X, y) # new instances where we do not know the answer Xnew, _ = make_regression(n_samples=3, n_features=2, noise=0.1, random_state=1) # make a prediction ynew = model.predict(Xnew) # show the inputs and predicted outputs for i in range(len(Xnew)): print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
运行该示例进行多个预测,然后并排打印输入和预测以供查看。
X=[-1.07296862 -0.52817175], Predicted=-61.32459258381131 X=[-0.61175641 1.62434536], Predicted=-30.922508147981667 X=[-2.3015387 0.86540763], Predicted=-127.34448527071137
一元回归预测
只要单个数据实例适当地包装在周围的列表或数组中,就可以使用相同的函数对其进行预测。
例如:
# example of training a final regression model from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression # generate regression dataset X, y = make_regression(n_samples=100, n_features=2, noise=0.1) # fit final model model = LinearRegression() model.fit(X, y) # define one new data instance Xnew = [[-1.07296862, -0.52817175]] # make a prediction ynew = model.predict(Xnew) # show the inputs and predicted outputs print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))
运行该示例进行单个预测,并打印数据实例和预测以供查看。
X=[-1.07296862, -0.52817175], Predicted=-77.17947088762787
进一步阅读
如果你想深入了解,本节提供了更多关于该主题的资源。