说明:本文依据《Sklearn 与 TensorFlow 机器学习实用指南》完成,所有版权和解释权均归作者和翻译成员所有,我只是搬运和做注解。 第四章是对模型训练内部工作流程的了解,帮助炼丹师们找到恰当的学习模型、算法、数据集。
为了尽量简单(懒),在这里默认已经了解线性回归、多项式回归、损失函数、梯度下降
1. 简单的线性回归模型,讨论两种不同训练方法的最优解
- 封闭方程求根运算,得到模型在当前训练集上的最优解。
- 迭代优化(梯度下降GD),调整模型参数获取最小损失函数。批量梯度下降、随机梯度下降、小批量梯度下降。
- 2. 多项式回归,用来拟合非线性数据集
- 介绍正则方式减少过拟合的出现
- 3. 介绍Logistic回归
- 4. 介绍Softmax回归
3. 逻辑回归
逻辑回归用于估计实例属于某个类别的概率,其实就是二分类器。
概率估计
逻辑回归模型计算输入的特征加权总和,再输入logistic函数进行处理后输出。生成一个逻辑方法图示,根据逻辑回归模型的输出值预测y
训练和损失函数
训练是为了得到θ使正例概率增大,负例概率减小,可以通过单个训练实例X的损失函数实现。 公式 逻辑回归损失函数(对数损失)
OK,得到这个损失函数之后如何求解?
无解的,因为没有等价的正态方程,但是这个损失函数是凸函数,可以通过求偏导数优化获取全局最小值。
决策边界
在这里使用iris数据库来分析逻辑回归。
iris中有三种Setosa,Versicolor,Virginica,可以建立一个分类器,通过花瓣宽度特征来识别Virginica。
1.加载数据
可以看到data项目中有四种字段[5.1, 3.5, 1.4, 0.2],这里只获取data中第三列数据。
对y数据进行处理,将label转为虚拟变量,这部分在机器学习Day3(机器学习100天-Day3) 中有介绍。
from sklearn import datasets from sklearn.linear_model import LogisticRegression iris=datasets.load_iris() list(iris.keys()) X=iris['data'][:,3:] y=(iris["target"] == 2).astype(np.int)
2.训练模型
log_reg=LogisticRegression() log_reg.fit(X,y)
3.评估模型
评估模型,设定花瓣宽度从0到3厘米
X_new=np.linspace(0,3,1000).reshape(-1,1) y_proba=log_reg.predict_proba(X_new) plt.plot(X_new,y_proba[:,1],"g-",label="Iris-virginica") plt.plot(X_new,y_proba[:,0],"b--",label="Not Iris-virginica") plt.show()
4.确定决策边界
Virginica 花的花瓣宽度在1.4厘米到2.5厘米之间,而其他种类的花通常具有较小的花瓣宽度,范围从0.1厘米到1.8厘米。因此,分类器在发现2厘米以上时会给出高概率值,在1厘米以下时会给出低概率值,基于上图,进一步绘制决策边界来观察。可以发现1.6厘米时一个决策边界。当数值大于1.6的时候判定为是,小于1.6是判定为否。
X_new=np.linspace(0,3,1000).reshape(-1,1) y_proba=log_reg.predict_proba(X_new) # X_new[y_proba[:,1]>=0.5]指label高于50%的label,就是预测确定为Iris-virginica decision_boundary=X_new[y_proba[:,1]>=0.5][0] plt.figure(figsize=(8,3)) #低概率,blue,square=>bs plt.plot(X[y==0],y[y==0],"bs") #高概率,green,^=>g^ plt.plot(X[y==1],y[y==1],"g^") #决策边界 plt.plot([decision_boundary,decision_boundary],[0,2],"k:",linewidth=2) plt.plot(X_new,y_proba[:,1],"g-",label="Iris-virginica") plt.plot(X_new,y_proba[:,0],"b--",label="Not Iris-virginica") #箭头标识 plt.arrow(decision_boundary, 0.08, -0.3, 0, head_width=0.05, head_length=0.1, fc='b', ec='b') plt.arrow(decision_boundary, 0.92, 0.3, 0, head_width=0.05, head_length=0.1, fc='g', ec='g') plt.xlabel("Petal width (cm)", fontsize=14) plt.ylabel("Probability", fontsize=14) plt.legend(loc="center left", fontsize=14) plt.axis([0, 3, -0.02, 1.02]) plt.show() #可以发现决策边界为1.6156 print(decision_boundary) #=>1.61561562 log_reg.predict([[1.62],[1.58]]) #array([1, 0])
接下来教程引入两个特征来进行预测。图很骚啊,这段代码要好好看
X_double=iris['data'][:,(2,3)] y_double=(iris["target"] == 2).astype(np.int) log_reg_double=LogisticRegression(solver="liblinear", C=10**10, random_state=42) log_reg_double.fit(X_double,y_double) x0,x1=np.meshgrid( np.linspace(2.9, 7, 500).reshape(-1, 1), np.linspace(0.8, 2.7, 200).reshape(-1, 1), ) #ravel():将多维数组转为一维数组,如果没有必要,不会产生源数据的副本 X_new_double=np.c_[x0.ravel(),x1.ravel()] y_proba=log_reg_double.predict_proba(X_new_double) plt.figure(figsize=(10, 4)) plt.plot(X_double[y_double==0, 0], X_double[y_double==0, 1], "bs") plt.plot(X_double[y_double==1, 0], X_double[y_double==1, 1], "g^") zz=y_proba[:,1].reshape(x0.shape) contour=plt.contour(x0,x1,zz,cmap=plt.cm.brg) left_right=np.array([2.9,7]) #生成决策边界 boundary=-(log_reg_double.coef_[0][0] * left_right + log_reg_double.intercept_[0]) / log_reg_double.coef_[0][1] plt.clabel(contour,inline=1,fontsize=12) plt.plot(left_right, boundary, "k--", linewidth=3) #文字描述和标签描述 plt.text(3.5, 1.5, "Not Iris-Virginica", fontsize=14, color="b", ha="center") plt.text(6.5, 2.3, "Iris-Virginica", fontsize=14, color="g", ha="center") plt.xlabel("Petal length", fontsize=14) plt.ylabel("Petal width", fontsize=14) plt.axis([2.9, 7, 0.8, 2.7]) plt.show()