用Scikit-learn解决分类与回归问题
- 线性回归模型
和其他Python框架一样,首先导入我们需要的库。在Scikit-Learn中,有很多已经封装好的算法库,包括一会要用的线性模型算法族库(linear_model)、最近邻算法族库(neighbors)、朴素贝叶斯算法族库(na?ve_bayes)、决策树模型算法族库(tree)、支持向量机模型算法族库(svm)、神经网络算法模型族库(neural_network)等等。这里肯定导入线性模型算法族库还有matplotlib来生成图像以及依靠numpy生成简单数据集。
import matplotlib.pyplot as plt import numpy as np
紧接着利用numpy生成一个0到 30且步长为1的序列,这在numpy中可以采用linspace函数实现。然后直接设定好线性模型的参数放入y上。同时为了模拟现实中随机数的情况再利用numpy加上一些随机数。之后利用matplotlib来生成散点图。
x = np.linspace(0,30,30) y = 4*x + 1 x = x + np.random.rand(30) plt.scatter(x,y)
我们初始设置线性模型为y = 4x + 1,最后得到如图1所示的散点图
图1.1 初始散点图
下面,我们就直接利用Scikit-Learn中的函数直接训练线性回归模型。和之间将线性回归时所讲的一样,Scikit-Learn采用最小二乘法拟合模型并采用奇异值分解的方法求解。自然,这里线性模型接收的参数只接收矩阵,因此我们还需要利用列表推导把x,y转成列表。并且我们设定一个x_来检测模型的预测结果。
x = [[i] for i in x] y = [[i] for i in y] x_ = [[1],[2]] model = linear_model.LinearRegression() model.fit(x,y) model.predict(x_)
线性模型中的权重参数w会自动存放在model.coef_变量中,而随机误差值b会存放在model.intercept_中。我们获取这两个变量,然后重新绘制折线图,就得到如图1.2所示的结果。
model = linear_model.LinearRegression() model.fit(x,y) model.predict(x_) w = model.coef_ b = model.intercept_ z = w*x + b plt.plot(x,z,‘g--‘) plt.show()
图1.2 线性回归模型拟合结果
我们也可以一下模型的预测结果:
图1.3 模型预测结果
从图1.3和1.4可以看到结果基本还是与初期设定的值是吻合的。
-
逻辑回归模型
逻辑回归某种程度上也属于线性模型但它反而是一个分类问题。所以在Scikit-Learn中也属于线性模型算法族库。同时由于是离散的分类问题,我们同样采用之前已经讲过的鸢尾花数据集。参数中return_X_y表示是否将自变量与因变量独立导出,我们这里肯定选True。之后调用LogisticRegression()函数,里面的参数max_iter表示最大迭代次数,这里设置成1000。最后的clf.predict()返回预测结果,clf.score()会用自带的性能评估器评价得分。
import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris X,y = load_iris(return_X_y=True) clf = LogisticRegression(max_iter=1000).fit(X,y) clf.predict(X) clf.score(X,y)
图2.1 预测结果和性能得分