概述
文章目录
- 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_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 良/恶性乳腺癌案例
数据描述:
- 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_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),先验概率即是否需要从历史数据中总结出概率信息。
最后
以上就是纯真小甜瓜为你收集整理的机器学习_第四天(线性回归+岭回归+逻辑回归)的全部内容,希望文章能够帮你解决机器学习_第四天(线性回归+岭回归+逻辑回归)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复