我是靠谱客的博主 纯真小甜瓜,最近开发中收集的这篇文章主要介绍机器学习_第四天(线性回归+岭回归+逻辑回归),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 1、回归算法-线性回归分析
      • 1.1 线性模型
      • 1.2 线性回归
      • 1.3 损失函数(误差大小)
        • 1.3.1 最小二乘法--正规方程(小数据<1w,少特征)
        • 1.3.2 最小二乘法之梯度下降(大数据>10w,多特征)
        • 1.3.3 正规方程与梯度下降对比
      • 1.4 回归性能评估
      • 1.5 波士顿房价数据案例
    • 2、过拟合与欠拟合
      • 2.1 欠拟合
      • 2.2 过拟合
    • 3、岭回归
    • 4、模型的保存与加载
    • 5、逻辑回归
      • 5.1 逻辑回归核心
      • 5.2 逻辑回归的损失函数
        • 5.2.1 线性回归与逻辑回归损失函数
        • 5.2.2 逻辑回归API
      • 5.3 良/恶性乳腺癌案例
      • 5.4 逻辑回归总结
      • 5.5 逻辑回归与朴素贝叶斯区分

1、回归算法-线性回归分析

1.1 线性模型

通过属性的线性组合来进行预测的函数:f(x)=w1x1+w2x2+…+wnxn+b
w为权重;b称为偏置项,可以理解为w0×1

1.2 线性回归

定义:线性回归通过一个或者多个自变量(特征)与因变量(目标值)之间关系,进行建模的回归分析。线性组合中可以有一个或多个称为回归系数的模型参数。

  • 一元线性回归:只涉及一个变量
  • 多元线性回归:涉及到两个或两个以上变量

通用公式:
在这里插入图片描述
其中w,x为矩阵:
在这里插入图片描述
矩阵必须是二维数组

  • np.multiply(a,b):两数组按位相乘
  • np.dot(a,b):两数组矩阵相乘

1.3 损失函数(误差大小)

  • yi为第i个训练样本的真实值
  • hw(xi)为第i个训练样本的预测函数

总损失定义:
在这里插入图片描述
称为误差平方和又称最小二乘法,减少这个损失常用梯度下降法

1.3.1 最小二乘法–正规方程(小数据<1w,少特征)

正规方程:
在这里插入图片描述
X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度慢。即对复杂的算法,不能使用正规方程求解w。
sklearn线性回归正规方程API:sklearn.linear_model.LinearRegression()

  • coef_:回归系数

1.3.2 最小二乘法之梯度下降(大数据>10w,多特征)

以单变量中的w0,w1举例
在这里插入图片描述
α为学习速率,需要手动指定;α后分式表示方向
在这里插入图片描述
经过训练集的迭代,更新w值,从而降低算法的误差。
训练集迭代的目的是为了找到最小损失对应的W值,沿着函数下降的方向更新W值。梯度下降法适用于训练数据规模十分庞大的任务。
sklearn线性回归梯度下降API:sklearn.linear_model.SGDRegressor()

  • coef_:回归系数

1.3.3 正规方程与梯度下降对比

在这里插入图片描述
小规模数据: LinearRegression(不能解决拟合问题)
大规模数据: SGDRegressor

1.4 回归性能评估

均方误差(Mean Squared Error-MSE) 评价机制:
在这里插入图片描述
其中y^i为预测值,¯y为真实值
sklearn均方误差回归损失API:sklearn.metrics.mean_squared_error(y_true, y_pred)

  • y_true:真实值
  • y_pred:预测值
  • return:返回浮点数结果

注:真实值,预测值都为标准化之前的值

1.5 波士顿房价数据案例

流程:

  1. 波士顿地区房价数据获取
  2. 波士顿地区房价数据分割
  3. 训练与测试数据标准化处理(目标值也需要进行标准化处理,.inverse_transform可以将标准化的数据还原成标准化之前的值)
  4. 使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测

注意: 特征工程与估计器都要求是二维数组,一维数组可以通过.reshape(-1,1)转换,-1表示行数未知,1列

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error

def linear():
    '''
    对波士顿房价进行线性回归
    用正规方程与梯度下降两种方法优化算法,降低误差
    :return:None
    '''
    # 1. 获取数据
    lb = load_boston()
    # 2. 分割训练集与测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
    print(y_train, y_test)  # 返回的特征值为一维数组,后需转换成二维数组使用
    print(x_train.shape)
    # 3. 特征工程:标准化
    # 线性回归的特征值和目标值都要进行标准化处理,需要分别实例化两个标准化API
    # 特征值标准化
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train.reshape(-1, 13))  # 特征工程与估计器都要求为二维数组
    x_test = std_x.transform(x_test.reshape(-1, 13))  # 一维数组可以通过.reshape(-1,1)转换,-1表示行数未知,1列
    # 目标值标准化
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))
    # 4. 算法预测
    # 4.1 正规方程求解方式预测结果
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    print('lr回归系数:', lr.coef_)
    y_lr_predict = lr.predict(x_test)
    y_lr_predict_r = std_y.inverse_transform(y_lr_predict)  # 将预测值还原成标准化之前的值
    print('lr测试集的真实预测值:', y_lr_predict_r)
    print('lr均方误差:', mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict_r))  # 真实值,预测值为标准化之前的值
    # 4.2 梯度下降求解方式预测结果
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    print('sgd回归系数:', sgd.coef_)
    y_sgd_predict = sgd.predict(x_test)
    y_sgd_predict_r = std_y.inverse_transform(y_sgd_predict)
    print('sgd测试集的真实预测值:', y_sgd_predict_r)
    print('sgd均方误差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict_r))
    return None

if __name__ == '__main__':
    linear()

2、过拟合与欠拟合

在这里插入图片描述
线性回归可以是线性关系数据,也可以是非线性关系系数据。对线性模型进行训练学习会变成复杂模型,模型复杂是因为数据的特征和目标值之间的关系复杂,不仅仅是线性关系。
在这里插入图片描述
可以由交叉验证判断是否存在拟合问题,训练集与测试集准确率都低则欠拟合,训练集准确率很高但测试集准确率明显下降则过拟合。

2.1 欠拟合

欠拟合:在训练数据上不能很好的拟合, 且在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。模型过于简单,机器学习到的特征太少,导致区分标准太粗糙,不能准确识别目标。
原因: 学习到数据的特征过少
解决办法: 增加数据的特征数量

2.2 过拟合

过拟合:在训练数据上能很好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。模型过于复杂,即机器学习到了非典型特征,导致区分标准有针对性,错误排除部分目标。
原因:

  • 原始特征过多,存在一些嘈杂特征
  • 模型尝试去兼顾各个测试数据点,导致特征出现高次项关系,模型过于复杂

解决办法:

  • 进行特征选择,消除关联性大的特征(很难)
  • 交叉验证(可以检验出是否有拟合问题)
  • 正则化(岭回归):减少高次项权重,使之趋近于0
    在这里插入图片描述

3、岭回归

Ridge岭回归,带有正则化的线性回归,具有l2正则化的线性最小二乘法。
sklearn岭回归API:sklearn.linear_model.Ridge(alpha=1.0)

  • alpha:正则化力度,减少高次项权重,使之趋近于0(alpha取值0 ~ 1小数或1 ~ 10整数)
    在这里插入图片描述
  • coef_:回归系数

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

4、模型的保存与加载

sklearn保存与加载API:sklearn.externals.joblib
保存:
joblib.dump(估计器,‘文件名.pkl’)

加载:
estimator=joblib.load(‘test.pkl’)

注:sklearn文件格式pkl,二进制文件

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Ridge
from sklearn.externals import joblib

def ridge():
    '''
    用岭回归对波士顿房价进行线性回归
    +
    保存与加载模型
    :return:None
    '''
    lb = load_boston()
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
    print(x_train.shape)
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train.reshape(-1, 13))
    x_test = std_x.transform(x_test.reshape(-1, 13))
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # 岭回归预测房价
    # rd = Ridge(alpha=1.0)
    # rd.fit(x_train, y_train)
    # 保存模型
    # joblib.dump(rd, './model/rd.pkl')
    # 加载模型
    rd = joblib.load('./model/rd.pkl') 
    print('岭回归,回归系数:', rd.coef_)
    y_rd_predict = rd.predict(x_test)
    y_rd_predict_r = std_y.inverse_transform(y_rd_predict)
    print('岭回归预测价格:', y_rd_predict_r)
    print('岭回归的均方误差:', mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict_r))
    return None

if __name__ == '__main__':
    ridge()

5、逻辑回归

逻辑回归是一种分类算法,只解决且擅长于二分类问题,得出任一类的概率值。因为逻辑回归是分类算法,所以不需要对目标值进行标准化处理。
逻辑回归的输入:
在这里插入图片描述
回归的输出结果是h(w),是sigmoid函数的参数z

5.1 逻辑回归核心

逻辑回归公式: g(z)为sigmoid函数,返回的是一个概率
在这里插入图片描述
任意值经过函数映射在0 ~ 1之间,即sigmoid函数可以将输入转换成一个[0,1]区间的概率值,默认0.5作为阀值(<0.5视为0类,>0.5视为1类)
在这里插入图片描述

5.2 逻辑回归的损失函数

与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解
对数似然损失函数: (hθ(x)是逻辑回归返回的概率值g(z))
在这里插入图片描述
逻辑回归只应用在二分类上,即只有正例(1类)和反例(0类),且只对一个类别进行判断
e.g 将1作为判断类别

  • 目标值为1类(y=1),概率为1,则损失为0;概率小于阀值时就判断为0类,概率越接近于0,损失越大
    在这里插入图片描述
  • 目标值为0类(y=0),此时仍以1作为判断类别,概率大于阀值就判断为1类,概率越接近于1,损失越大;概率为0,则是1类的可能为0,判断为0类,损失为0。
    在这里插入图片描述

完整的损失函数:
在这里插入图片描述
cost损失的值越小,那么预测的类别准确度更高

5.2.1 线性回归与逻辑回归损失函数

算法策略(损失函数)优化
线性回归均方误差(也称最小二乘法)正规方程、梯度下降(学习率)
逻辑回归对数似然损失梯度下降
  • 均方误差不存在多个局部最低点,只存在一个最小值
    在这里插入图片描述
  • 对数似然损失可能存在多个局部最低点
    在这里插入图片描述
    使用梯度下降求解损失函数最小值时,可能求得的是局部最小值而非全局最小值。目前无法完美求出全局最小值,只可以通过两种方法来改善
        1. 多次随机初始化起点,求得多个局部最小值进行比较,取其中的最小的当做全局最小值
        2. 调整学习率,当学习率较快时可以略过部分数据

5.2.2 逻辑回归API

sklearn逻辑回归API: sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)

  • penalty:以l2形式正则化,解决过拟合问题
  • c:正则化力度
  • coef_:回归系数

5.3 良/恶性乳腺癌案例

数据描述:

  1. 699条样本,共11列数据,第一列是用于检索的id,后9列分别是与肿瘤相关的医学特征,最后一列表示肿瘤类型的数值。
  2. 包含16个缺失值,用”?”标出。

流程:

  1. 网上获取数据
    ▶ pd.read_csv(’’,names=column_names):读取数据
      column_names:指定类别名字
    ▶ replace(to_replace=’’,value=):对字符串缺失值替换为np.nan
      注意:若后续对空值做统计值填充处理,需先将数据类型强制转换成float
      df.astype(float)
    ▶ dropna():删除空值数据
    ▶ for column in list(df.columns[df.isnull().sum() > 0]): # 对空值填充统计值
     # data.isnull().sum(),对当列空值数计数;df.columns获取列名
          mean_val = df[column].mean()
          df[column]=df[column].fillna(mean_val)
  2. 数据缺失值处理、标准化
  3. LogisticRegression估计器流程

在逻辑回归中,根据样本的数量大小而定,当哪一类占比小,则以此类作为判断类别,视为正例。
此案例中良性为357,恶性为212,则恶性作为判断类别。即当概率趋向1则视为恶性类别(正例),概率趋向0则视为良性类别(反例)。
注意: pandas在读取数据时,默认将数据的第一行视为列名。此数据第一行为数据非列名,需要参数指定names参数,避免第一行数据误读成列名

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

def logistic():
    '''
    逻辑回归做二分类
    对癌症良性恶性进行预测(根据细胞属性特征)
    :return: None
    '''
    # 1. 读取数据
    # pandas默认将首行读成列名
    # 原始数据首行无列名,指定列名
    column_name = ['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_name)
    # print(data.info())
    # 2. 数据处理
    # 对缺失值‘?’进行处理,替换成np.nan
    data = data.replace(to_replace='?', value=np.nan)
    # 对替换后的数据强制转换成float型,用于计算均值
    data['Bare Nuclei'] = data['Bare Nuclei'].astype(float)
    # 处理nan数据
    # a.删除nan数据
    # data = data.dropna()
    # b.对nan填充均值
    for column in list(data.columns[data.isnull().sum() > 0]):  # data.isnull().sum(),对当列空值数计数
        mean_val = data[column].mean()
        data[column] = data[column].fillna(mean_val)
        # data[column].fillna(mean_val, inplace=True),指定了参数inplace则原对象修改无返回值
    print(data)
    # 明确特征值与目标值
    y = data['Class']
    x = data.iloc[:,1:-1]
    # 分割测试集与训练集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    # 3. 对特征值进行标准化处理(逻辑回归是分类算法,不需要对目标值进行标准化处理)
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)
    # 4. 进行逻辑回归算法
    lg = LogisticRegression(penalty='l2', C=1.0)  # 正则化力度C是一个超参数
    lg.fit(x_train, y_train)
    print('逻辑回归系数:', lg.coef_)
    print('准确率:', lg.score(x_test, y_test))
    # 召回率需指定目标名,逻辑回归label与target_names相对应,2代表良性,4代表恶性
    print('召回率recall相关信息:',
          classification_report(y_test, lg.predict(x_test), labels=[2, 4], target_names=['良性', '恶性']))
    return None

if __name__ == '__main__':
    logistic()

5.4 逻辑回归总结

应用:

  • 广告点击率预测
  • 金融诈骗
  • 电商购物搭配推荐等

优点:

  • 适合需要得到一个分类概率的二分类场景

缺点:

  • 不擅长处理多分类问题,需要先分成二分类问题,再向下细分(多分类问题可用决策树、随机森林、神经网络–softmax方法:逻辑回归在多分类问题上的推广)

5.5 逻辑回归与朴素贝叶斯区分

逻辑回归:通过概率判断正例反例朴素贝叶斯:通过概率值大小对文本分类
模型类型判别模型生成模型
解决问题二分类问题多分类问题
应用场景广告点击率等二分类需要概率值的问题文本类型分类
参数C:正则化力度

k近邻、决策树、随机森林、逻辑回归、神经网络都是判别模型。判别模型无先验概率P(C),先验概率即是否需要从历史数据中总结出概率信息。

最后

以上就是纯真小甜瓜为你收集整理的机器学习_第四天(线性回归+岭回归+逻辑回归)的全部内容,希望文章能够帮你解决机器学习_第四天(线性回归+岭回归+逻辑回归)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部