• 数据的处理和特征工程


    数据的预处理和特征工程

    a.数值型特征,如:长度、宽度、像素值等

    b.数值范围归一化(feature normalization)可能会提高模型的性能,如:线性回归,kNN,SVM,神经网络等

    c.最大最小归一化:将原始数据变换映射到0-1之间,消除量纲的影响

    将数据中最大的值转化为1,最小的值转化为0

    MinMaxScaler是个归一化工具,将数据的取值范围转换成0到1之间。

    比如所有数据中的最大值为max,最小值为min,一个数值x通过MinMaxScaler转换之后,取值为(x - min) / (max - min)。

    机器学习中,不同属性的取值范围可能存在不同的跨度,比如人类身高的取值可能是0.5到2.5米,而体重取值可能是3到200公斤。当把不同量纲的数值放到一起训练的时候,会存在偏向性,取值范围小的数值会被忽略。比如身高2.5看起来比0.5只大了2,这个值在身高差中已经很大了,但50公斤跟52公斤之间这个2的差别却远不应该受到同样的重视。

    于是需要使用Scaler对数值的取值范围进行重新整理。

    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()  # 默认归一化是0-1
    X_train_scaled = scaler.fit_transform(X_train)
    # 上面其实做了两件事情①拿到训练集的最大最小值②将数值进行转换
    X_test_scaled = scaler.transform(x_test)
    #  这个地方不能再进行fit,因为在此之前的训练集上已经获取到最大和最小值了,因此这一步只需要进行映射到测试集即可
    knn.fit(X_train_scaled, y_train)  # 在归一化的训练集上进行调整
    #  进行测试
    knn.score(X_test_scaled, y_test)

    从上述代码可以看出:

    先对训练集进行归一化,然后对测试集进行归一化

    在测试集上的scaler和训练集上的scaler要保持一致;不要在训练集和测试集分别使用不同的scaler

    拟合:

    ①过拟合:

    a.模型对于训练数据拟合程度过当,以致太适应训练数据而非一般情况。

    b.在训练数据上表现非常好,但是在测试数据或验证数据上表现很差。

    欠拟合与之相反!

    造成过拟合的原因:

    1. 训练数据过少
    2. 模型过于复杂

    过拟合的解决方法:

    收集更多的数据

    降低模型复杂度(正则化:控制模型复杂度,模型复杂度越高,越容易过拟合)

     

    模型的调参:

    模型参数包括两种

    a.模型自身参数,通过样本学习得到的参数。如:逻辑回归及神经网络中的权重及偏置的学习等(不要我们操作)

    b.超参数,模型框架的参数,如kNN中的k,SVM中的C。通常由手工设定

    如何调参

    a.依靠经验

    b.依靠实验:k折-交叉验证(cross validation)

     如何进行模型调参呢?

    按照之前的想法是先分为训练集和测试集;但现在我们需要在训练集上的再次分为训练集和测试集

    按照上图的切割方法进行5次交叉验证

    根据数据量的情况定多少折进行交叉验证,在拿到最优参数之后在整个的训练集上再去做一个实验

    模型调参的方法:

    1,交叉验证

    sklearn.model_selection.cross_val_score()

    在代码中:

    from sklearn.model_selection import cross_val_score
    
    # k近邻距离算法
    k_list = [1,3,5,7,9]  # 首先需要提供调参的范围
    for k in k_list:
        jnn = KNeighborsClassifier(n_neighbors=k)
        var_scores = cross_val_score(jnn, X_train, y_train,cv=3)  # cv表示做一个三折的交叉验证
        val_score = var_scores.mean()
    # 选择最优参数,重新训练模型
    best_knn = KNeighborsClassifier(n_neighbors=3)
    best_knn.fit(X_train, y_train)
    print(best_knn.score(X_test, y_test))  # 测试模型

    2,网格搜索(Grid Search),适用于多个超参数需要调整的情况,单个参数也可以使用

    aklearn.model_selection.GridSeachCV()

    代码的实现

    from sklearn.model_selection import GridSearchCV
    params = {'n_neighbors': [1.3.5.7.9], 'c': [1,4,7]}
    knn = KNeighborsClassifier()
    clf = GridSearchCV(knn, params, cv=3)
    clf.fit(X_train, y_train)
    clf.best_params_  # 最优参数
    best_model = clf.best_estimator_
    # 获取最优模型
    # 注意:GridSearchCV默认会使用最优的参数自动重新训练,所以不需要手工操作(refit=True)
    print(best_model.score(X_test, y_test))

    所以使用第二种方式做法更加方便

    模型的测试及评价

    那模型是不是只有准确率一个评价的参数呢?当然不是了

    模型评价指标介绍:

    真正例(TP),预测值是1,真实值是1。被正确分类的正例样本。

    假正例(FP),预测值是1,但真实值是0

    真反例(TN),预测值是0,真实值是0

    假反例(FN),预测值是0,但真实值是1

    召回率(Recall):TP/(TP + FN)

    表示在所有正样本中,被预测正确的个数,即查全率

    精确率(Precision): TP/(TP + FP)

    表示在所有预测为正样本中,被预测正确的个数,即查准率

    注意:Recall和precision只适用于二分类问题

    sklearn.metrics中包含常用的评价指标

    accuracy_score

    precision_score

    recall_score

    f1_score

    用于多分类模型的评价

    混淆矩阵(confusion matrix)

    scikit-learn方法:sklearn.metrics.confusion_matrix()

  • 相关阅读:
    博客CSS样式 二
    产品经理
    HttpClient调用doGet、doPost、JSON传参及获得返回值
    Maven无法下载com.oracle:ojdbc.jar解决方法
    EasyExcel导入导出
    centos7 安装supervisor教程以及常见问题
    Django与Celery的安装使用
    亚马逊广告api v2版php扩展库
    Mac VMware Fusion CentOS7 安装、配置静态IP文档
    常见Web安全问题攻防解析
  • 原文地址:https://www.cnblogs.com/zhoulixiansen/p/10841553.html
Copyright © 2020-2023  润新知