美文网首页数学和算法
UD机器学习 - C2 机器学习基础

UD机器学习 - C2 机器学习基础

作者: 左心Chris | 来源:发表于2019-09-30 10:57 被阅读0次

    训练和测试模型: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

    相关文章

      网友评论

        本文标题:UD机器学习 - C2 机器学习基础

        本文链接:https://www.haomeiwen.com/subject/ushkyctx.html