sklearn之逻辑回归和岭回归

过拟合与欠拟合

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

欠拟合原因以及解决办法

  • 原因:学习到数据的特征过少
  • 解决办法:增加数据的特征数量

过拟合原因以及解决办法

  • 原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点,数据的特征和目标值之间不仅仅是线性关系

  • 解决办法:

    • 进行特征选择,消除关联性大的特征(很难做)
    • 交叉验证(让所有数据都有过训练)
    • 正则化

回忆一下特征选择方法:

  • 过滤式:低方差特征
  • 嵌入式:正则化,决策树,神经网络

L2正则化

作用:可以使得W的每个元素都很小,都接近于0

优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

线性回归:LinearRegression 容易出现过拟合,为了把训练接数据表现更好

L2正则化:Ridge:岭回归 带有正则化的线性回归 解决过拟合

岭回归

带有正则化的线性回归-Ridge

sklearn.linear_model.Ridge

Ridge

具有l2正则化的线性最小二乘法

  • sklearn.linear_model.Ridge(alpha=1.0)
    • alpha:正则化力度
    • coef_:回归系数
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error


def mylinear():
    """
    线性回归直接预测房子价格
    :return: None
    """
    # 获取数据
    lb = load_boston()

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
    # 进行标准化处理(目标值要进行标准化处理)
    # 特征值和目标值都必须进行标准化处理, 实例化两个标准化API
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目标值
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # estimator预测
    # 岭回归去进行房价预测
    rd = Ridge(alpha=1.0)
    rd.fit(x_train, y_train)

    print(rd.coef_)

    # 预测测试集的房子价格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    print("岭回归测试集里面每个房子的预测价格: ", y_rd_predict)
    print("岭回归的均方误差: ", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))


if __name__ == "__main__":
    mylinear()

线性回归 LinearRegression与Ridge对比

岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。

分类算法-逻辑回归

逻辑回归:线性回归的式子作为逻辑回归的输入,适用于二分类场景,他也能得出概率值

  • 广告点击率
  • 判断用户的性别
  • 预测用户是否会购买给定的商品类
  • 判断一条评论是正面的还是负面的

逻辑回归是解决二分类问题的利器

逻辑回归

输入:

逻辑回归的输入-sigmoid→分类

sigmodid函数会把值映射到[0, 1],也就是把我们的输入值转换成一个概率值

逻辑回归公式

公式:

输出:[0,1]区间的概率值,默认0.5作为阀值

注:g(z)为sigmoid函数

逻辑回归的损失函数、优化

与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解

对数似然损失函数:

损失函数:

  • 均方误差:不存在多个局部最低点,只有一个最小值
  • 对数似然损失:多个局部最小值

对数似然损失求出来的不一定是总函数的最小值,目前还是一个解决不了的问题,但是我们可以采取一些方案去尽量改善:

  1. 多次随机初始化,多次比较最小值结果
  2. 求解过程中,调整学习率

尽管没有全局最低点,但是效果都是不错的

sklearn逻辑回归API

sklearn.linear_model.LogisticRegression

LogisticRegression

sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)

  • Logistic回归分类器
  • coef_:回归系数
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
import joblib
import pandas as pd
import numpy as np
import ssl


def logistic():
    """
     良/恶性乳腺癌肿瘤预测

     原始数据的下载地址:

     https://archive.ics.uci.edu/ml/machine-learning-databases/
    逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
    :return: None
    """
    ssl._create_default_https_context = ssl._create_unverified_context
    # 构造列标签名字
    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(
        "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
        names=column)

    print(data)

    # 缺失值进行处理(替换“?”为nan)
    data = data.replace(to_replace='?', value=np.nan)
    #直接删除掉nan
    data = data.dropna()

    # 进行数据的分割
    x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)

    # 进行标准化处理
    std = StandardScaler()
    #训练数据标准化
    x_train = std.fit_transform(x_train)
    # 测试数据标准化
    x_test = std.transform(x_test)

    # 逻辑回归预测 # 默认使用L2正则化避免过拟合,C=1.0表示正则力度(超参数,可以调参调优)
    lg = LogisticRegression(C=1.0)

    lg.fit(x_train, y_train)
    #回归的系数
    print(lg.coef_)
    #回归预测
    y_predict = lg.predict(x_test)

    print("准确率:", lg.score(x_test, y_test))

    print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))

    return None


if __name__ == "__main__":
    logistic()

LogisticRegression总结

应用:广告点击率预测、电商购物搭配推荐

优点:适合需要得到一个分类概率的场景

缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)

生成模型和判别模型

先验概率:从历史的数据中总结出概率信息。

需要进行先验概率的模型就是生成模型。

判别模型:k-近邻,决策树,随机森林,神经网络

生成模型:朴素贝叶斯,隐马尔可夫模型

 逻辑回归朴素贝叶斯
解决问题二分类多分类
应用场景二分类需要概率的问题文本分类
参数正则化力度没有

参考地址:https://www.jianshu.com/p/8b802d24eb39

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值