• 7.逻辑回归实践


    1.逻辑回归是怎么防止过拟合的?为什么正则化可以防止过拟合?(大家用自己的话介绍下)

    在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不工作。
    防止过拟合的方法有:
    1、增加样本数量
    2、正则化:当数据稀疏时,使用L1正则化比L2效果要好
    3、特征筛选:剔除不必要的特征
    4、检查业务逻辑,判断特征的有效性
     
    正则化参数变得很大,参数W很小,z也会相对变小,此时忽略b的影响,z会相对变小,实际上,z的取值范围很小,这个激活函数,也就是曲线函数tanh会相对呈线性,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合。

    2.用logiftic回归来进行实践操作,数据不限。

    使用cancer.csv进行实践:

    import pandas as pd
    import numpy as np
    from sklearn.linear_model import LogisticRegression, LogisticRegressionCV
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import classification_report
    
    
    def logic():
        column = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
                  'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli',
                  'Mitoses', 'Class']
    
        # 读取数据
        data = pd.read_csv('./cancer.csv', names=column)
        # 替换数据中的问号
        data.replace(to_replace='?', value=np.nan, inplace=True)
        # 然后删除nan所在的行
        data.dropna(how='any', inplace=True)
    
        x = data.iloc[:, 1:10]
        y = data.loc[:, 'Class']
    
        x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=1)
        sd = StandardScaler()
        x_train = sd.fit_transform(x_train)
        x_test = sd.transform(x_test)
    
        # lr = LogisticRegression()
        # params = {'solver': ['lbfgs'], 'penalty': ['l2'], 'C': [0.01, 0.1, 1.0, 10.0, 100.0]}
        # gv = GridSearchCV(lr, param_grid=params, cv=4)
        #
        # gv.fit(x_train, y_train)
        # y_pred = gv.predict(x_test)
        #
        # print(gv.best_score_)
        # print(gv.best_params_)
        #
        # print('训练集score:', gv.score(x_train, y_train))
        # print('测试集score:', gv.score(x_test, y_test))
    
        # 以下是通过上边的网格搜索得出的C值
        c = [0.01, 0.1, 1.0, 10.0, 100.0]
        for i in range(5):
            print('*' * 20, i)
            lr = LogisticRegression(C=c[i], solver='lbfgs', penalty='l2')
            lr.fit(x_train, y_train)
            y_pred = lr.predict(x_test)
            print('训练集score:', lr.score(x_train, y_train))
            print('测试集score:', lr.score(x_test, y_test))
            print(classification_report(y_test, y_pred, labels=[2, 4], target_names=['良性', '恶性']))
    
    if __name__ == '__main__':
        logic()

    测试结果:

  • 相关阅读:
    经典卷积神经网络(LeNet、AlexNet、VGG、GoogleNet、ResNet)的实现(MXNet版本)
    Gluon 实现 dropout 丢弃法
    『MXNet』第六弹_Gluon性能提升 静态图 动态图 符号式编程 命令式编程
    Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)
    固定权重 关于Mxnet的一些基础知识理解(1)
    『MXNet』第四弹_Gluon自定义层
    积神经网络(CNN)的参数优化方法
    推荐!PlayGround:可视化神经网络
    激活函数可视化
    Tuxedo低版本客户端(Tuxedo 9)连接到高版本Tuxedo服务端(Tuxedo 12.1.3)的问题
  • 原文地址:https://www.cnblogs.com/chuichuichui1998/p/12784792.html
Copyright © 2020-2023  润新知