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 测试模型

通过分割训练集和测试集,用测试集测试

Use

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容