机器学习_第四天(线性回归+岭回归+逻辑回归)
文章目录
- 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 波士顿房价数据案例
流程:
- 波士顿地区房价数据获取
- 波士顿地区房价数据分割
- 训练与测试数据标准化处理(目标值也需要进行标准化处理,.inverse_transform可以将标准化的数据还原成标准化之前的值)
- 使用最简单的线性回归模型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_errordef 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 Noneif __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 joblibdef 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 Noneif __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 良/恶性乳腺癌案例
数据描述:
- 699条样本,共11列数据,第一列是用于检索的id,后9列分别是与肿瘤相关的医学特征,最后一列表示肿瘤类型的数值。
- 包含16个缺失值,用”?”标出。
流程:
- 网上获取数据
▶ 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) - 数据缺失值处理、标准化
- 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_reportdef 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.nandata = 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 Noneif __name__ == '__main__':logistic()
5.4 逻辑回归总结
应用:
- 广告点击率预测
- 金融诈骗
- 电商购物搭配推荐等
优点:
- 适合需要得到一个分类概率的二分类场景
缺点:
- 不擅长处理多分类问题,需要先分成二分类问题,再向下细分(多分类问题可用决策树、随机森林、神经网络–softmax方法:逻辑回归在多分类问题上的推广)
5.5 逻辑回归与朴素贝叶斯区分
逻辑回归:通过概率判断正例反例 | 朴素贝叶斯:通过概率值大小对文本分类 | |
---|---|---|
模型类型 | 判别模型 | 生成模型 |
解决问题 | 二分类问题 | 多分类问题 |
应用场景 | 广告点击率等二分类需要概率值的问题 | 文本类型分类 |
参数 | C:正则化力度 | 无 |
k近邻、决策树、随机森林、逻辑回归、神经网络都是判别模型。判别模型无先验概率P(C),先验概率即是否需要从历史数据中总结出概率信息。
机器学习_第四天(线性回归+岭回归+逻辑回归)相关推荐
- 监督分类空白处也被分类了_监督学习(2)|本质是分类的“逻辑回归”
引言 机器学习,绕不开预测问题,预测绕不开回归和分类.本篇介绍最常用的二分类算法:逻辑回归(Logistics Regression),当然随着算法的发展,它也可用于多分类问题.每一个算法都是许许多多 ...
- 机器学习算法——以癌症分类为例子介绍 逻辑回归(sklearn实现)
目录 1.逻辑回归介绍 1.1.逻辑回归的应用场景 1.2.逻辑回归的原理 1.2.1 输入: 1.2.2 激活函数 1.3.损失以及优化 1.3.1 损失 1.3.2 优化 总结: 2.逻辑回归ap ...
- 逻辑斯蒂回归 逻辑回归_逻辑回归简介
逻辑斯蒂回归 逻辑回归 Logistic regression is a classification algorithm, which is pretty popular in some commu ...
- Interview:算法岗位面试—10.24下午—上海某软件公司(机器学习,上市)电话面试—考察SVM、逻辑回归、降低过拟合、卷积网络基础等
Interview:算法岗位面试-10.24下午-上海某软件公司(机器学习,上市)电话面试-考察SVM.逻辑回归.降低过拟合.卷积网络基础等 导读:当时电话来的非常快,我刚做完一家公司的笔试,接着来了 ...
- 机器学习Sklearn实战——其他线性回归模型、逻辑回归
线性回归岭回归套索回归比较 import numpy as np from sklearn.linear_model import LinearRegression,Ridge,Lasso#50样本, ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,编程语言番外篇之机器学习(项目预测模块总结:线性回归算法、逻辑回归分类算法)~整起
机器学习 一.机器学习常见算法(未完待续...) 1.算法一:线性回归算法:找一条完美的直线,完美拟合所有的点,使得直线与点的误差最小 2.算法二:逻辑回归分类算法 3.算法三:贝叶斯分类算法 4.算 ...
- 机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析
一.线性回归 线性回归(linear regression:试图学得一个线性模型以尽可能准确地预测实值输出标记. 1.最简单的形式:输入属性的数且只有一个, 最小二乘法:基于均方差误差最小化来进行模型 ...
- 机器学习基础(四)预测方法(分类回归)概述
预测问题 任务描述 任务目标: 总体来说,分类问题与回归问题的目的是一致的,都是为了预测 根据预测目标不同,可以将预测问题分为以下三类 分类: 预测目标值无顺序意义且为有限个数离散量 预测目标值只有单 ...
- 机器学习十大算法系列(一)——逻辑回归
本系列博文整理了常见的机器学习算法,大部分数据问题都可以通过它们解决: 1.线性回归 (Linear Regression) 2.逻辑回归 (Logistic Regression) 3.决策树 (D ...
- 机器学习100天(十七):017 逻辑回归梯度下降
机器学习 100 天,今天讲的是:逻辑回归-梯度下降! 在讲解了逻辑回归的基本原理和损失函数之后,我们来推导逻辑回归模型中参数 w 和 b 的梯度表达式. 我们之前介绍过,计算逻辑回归的代价函数实际上 ...
最新文章
- pythonweb静态服务器_Python面向对象之Web静态服务器
- 任意的android程序,Android任意位置获取应用Context
- vue 怎么在字符串中指定位置插入字符_vue 我想在一个字符串中间加入一个/br 该怎么写?...
- kudu 存储引擎简析
- 实战-130W表增加字段耗时
- 一次堆外内存泄露的排查过程
- 删除China Lucky系列病毒 后缀.evopro勒索病毒数据恢复方法,解密处理方式
- backbone, AngularJS, EmberJS 简单比较
- Android5.1权限问题解决
- 达梦数据库管理工具介绍
- Win10编译和测试libModbus
- Android 真实简历
- TP-LINK_841N_V8路由器硬改升级OpenWRT记
- 鄙人最新作JS自动适应的图片弹窗
- 【蓝牙sbc协议】sbc源码阅读笔记(二)——sbc_struct详解(下)
- VRay Next for SketchUp 赋予材质常见问题
- 越是领军人才,越要看基本素质
- 76位健康专家共荐防病36计
- 刚柔相济 端庄大方——张銅彦行楷书摭谈
- 二叉搜索树(平衡二叉搜索树)
热门文章
- 从sk_buff中的线性区与非线性区到 bpf_skb_pull_data
- rows between unbounded preceding and current row等,unbounded ,preceding ,following,current row含义详解
- Java学习1——计算机基础知识
- 基于图书管理系统的需求分析之威胁建模
- 电影票的c语言程序,不知道电影票在小程序也能购买的?分享3款购票小程序赶紧来看看!...
- 网站服务器ftp破解,Wing FTP Server(FTP服务器)
- 分类变量 哑变量矩阵 指标矩阵_ML基础:协方差矩阵
- 从原理上解释什么是DDR的ZQ校准?
- 如何实现验证码输入正确与否的判断?
- 提高新股中签率的技巧|新股中签技巧