UD机器学习 - C2 机器学习基础
训练和测试模型:sklearn基本语句,pandas和numpy,train_test_split
评估指标:混淆矩阵,准确率,精度,召回率,F1,Fbeta,ROC曲线
回归指标:绝对值,平方差,r2 score
模型选择:交叉验证,学习曲线,网格搜索
1 训练和测试模型
1.1 统计学知识
居中趋势测量:均值、中值、众数。
数据的离散性:四分位距法、异常值、标准偏差、贝塞尔修正(算样本方差和样本标准差时把n变为n-1)。
1.2 pandas 和 numpy
import pandas as pd
import numpy as np
df = pd.read_csv('.csv')
np.array(df[["x","y"]])
Data frame and numpy简介
https://juejin.im/post/5ad57db3f265da239c7bd9fb
https://zhuanlan.zhihu.com/p/27624814
1.3 sklearn 训练模型
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
from sklearn.neural_network import MLPClassifier
classifier = MLPClassifier()
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier()
from sklearn.svm import SVC
classifier = SVC()
from sklearn.linear_model import
classifier.fit(X,y)
调整参数
classifier = SVC()
classifier.fit(X,y)
classifier = SVC(kernel = 'poly', degree = 2)
后面的课程会介绍自动调整参数
1.4 测试模型
通过分割训练集和测试集,用测试集测试
Shall never use your testing data for training
2 评估指标
混淆矩阵
True或False代表预测的对错,Postive或Negtive代表预测的方向
准确率 Accuracy
(TP + TN) / ALL
所有预测正确的/总数
from sklearn.metrics import accuracy_score
不适用于一些情况,比如预测信用卡欺诈,全部预测为没问题,虽然准确率高,但是有问题
假阴性和假阳性
不同的案例使用不同的指标
医疗检测是尽可能找到所有生病的人
垃圾邮件是找出的垃圾邮件,最好是垃圾邮件
精度 Precision
TP / (TP + FP)
所有预测为positive的点,有多少为真的positive,使用TP做分子
适用于垃圾邮件检测
召回率 Recall
所有真的positive的点,有多少被正确预测为positive
TP / (TP + TN)
适用于医疗模型
F1和F-beta
2/F1 = 1/Recall + 1/Precision
调和平均数总是小于算术平均数,调和平均数接近于更小的那个数
1/Fβ = N^2 / ((1+N^2) *recall) + 1 / ((1+N^2) *precision)
Fβ = (1+N^2) (precision * recall) / N^2 *precision + recall
如果 β=0, 则得出精度。
如果 β=∞, 则得出召回率。
对于 other values of β, 的其他值,如果接近 0,则得出接近精度的值,如果很大,则得出接近召回率的值,如果 β=1, 则得出精度和召回率的调和平均数
ROC曲线
两个召回率坐标,画图像,面积越接近1最好
ROC空间将伪阳性率(FPR)定义为 X 轴,真阳性率(TPR)定义为 Y 轴。
- TPR:在所有实际为阳性的样本中,被正确地判断为阳性之比率。
- FPR:在所有实际为阴性的样本中,被错误地判断为阳性之比率。
- 完美的就是从左到右为(1,1)到(0,0)
记住两张图,从(1,1)->(0,1)->(0,0)是完美分割的从左到右的经过(左为negative右为positive)
回归指标
Mean absolute error
from sklearn.metrics import mean_absolute_error
from sklearn.linear_model import LInearRegression
classifier = LinearRegression()
classifier.fit(X, y)
guesses = classifier.predict(X)
error = mean_absolute_error(y, guesses)
缺点不能求导,不好用梯度下降
Mean squared error
from sklearn.metrics import mean_squared_error
R2 score
Use R2 score = 1 - 实际的/过中心点的直线
from sklearn.metrics import r2_score
r2_score(y_true, y_pred)
R2接近1模型好,接近0模型差
3 模型选择
错误类型
Underfitfing and overfitting交叉验证
Model complexity graph 交叉验证来遵守训练的时候不使用测试集的原则:训练集用来训练模型,验证集来选择超参数以便减少像过拟合的问题
简单交叉验证把Training set 分为训练集和交叉验证集,test set不变
K折验证交叉
目的是不浪费验证集,把数据分为k份留一份为测试集,剩余为交叉验证集
训练k次,把结果的平均误差选为最后的结果来判断
from sklearn.model_selection import KFold
kf = KFold(12,3) #12 is size of data and 3 is the size of the testing set
kf = KFold(12,3,shuffle=True)
学习曲线
关于学习曲线的用法的介绍
https://deeplearning-ai.github.io/machine-learning-yearning-cn/docs/ch28/
https://zhuanlan.zhihu.com/p/33700459
https://www.jiqizhixin.com/articles/2018-01-23
检测是否过拟合, 传入一个数据集,然后cv分开成训练集和验证集,用训练集的一部分用来训练,误差为训练误差,验证集计算前面训练后的为验证误差。
这篇官方文档写的不错:
Validation curve和Learning curve
http://sklearn.lzjqsdd.com/modules/learning_curve.html
每个预测模型都有它的优缺点。大体上它的误差由偏差(bias)、方差(variance)和噪声(noise)组成。一个模型的 偏差 指其对于不同的训练样本集,预测结果的平均误差。方差 指模型对于不同训练样本集的敏感程度。噪声则是数据集本身的一项属性。
偏差和方差是预测模型固有的属性,我们通常必须选择合适的学习算法和超参数来尽可能同时降低它们(见 Bias-variance dilemma)。另一种降低方差的方式为使用更多的训练数据。但只有当使用更低方差的模型仍然无法拟合过于复杂的函数时,你才应该着手去收集更多的训练数据。
https://github.com/ZSMX/Udacity_Machine_Learning/tree/master/C2/LearningCurve
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
随着训练点数的增加,训练误差和交叉验证集误差 training error and CV error
好的模型两个误差相交与一点且比较低,可以查看是否过拟合
上面测量的是得分,翻转一下就是误差了,和上上面的图对应:
网格搜索
训练流程
用训练集训练parameters,然后用验证集计算指标(比如F1 score)选择超参数,最后用测试集判断这个模型好不好
sklearn使用网格搜索
比如训练SVM,有以下超参数:
kernel:poly或rbf。
C:0.1,1 或 10。
https://github.com/ZSMX/Udacity_Machine_Learning/tree/master/C2/GridSearch
- 1 导入
from sklearn.model_selection import GridSearchCV - 2 选择参数
parameters = {'kernel':['poly', 'rbf'],'C':[0.1, 1, 10]} - 3 建立评分机制
from sklearn.metrics import make_scorer
from sklearn.metrics import f1_score
scorer = make_scorer(f1_score) - 4 使用参数 (parameter) 和评分机制 (scorer) 创建一个 GridSearch 对象。 使用此对象与数据保持一致 (fit the data)
Create the object.
grid_obj = GridSearchCV(clf, parameters, scoring=scorer)
(class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=False)
cv default value if None will change from 3-fold to 5-fold in v0.22.)
Fit the data
grid_fit = grid_obj.fit(X, y) - 5 获取最佳估算器(estimator)
best_clf = grid_fit.best_estimator_
4 项目
预测料理
https://github.com/ZSMX/Udacity_Machine_Learning/tree/master/C2/PredictYourCuisine
如何使用 scikit-learn 为机器学习准备文本数据
https://zhuanlan.zhihu.com/p/33779124
预测boston房价
https://github.com/ZSMX/Udacity_Machine_Learning/tree/master/C2/BostonHousingPrice