回归算法-线性回归分析
线性模型
试图学得一个通过属性的线性组合
来进行预测的函数:
f(x)=w1x1+w2x2+…+wdxd+b
w为权重,b称为偏置项,可以理解为:w0×1
线性回归
定义: 线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
一元线性回归: 涉及到的变量只有一个
多元线性回归: 涉及到的变量两个或两个以上
通用公式:ℎ(w)= w0+w1x1+w2x2+…= wTx
其中w,x为矩阵:
单变量
多变量
损失函数(误差大小)
yi为第i个训练样本的真实值
ℎw(xi)为第i个训练样本特征值组合预测函数
总损失定义:
又称最小二乘法
尽量去减少这个损失(两种方式)
如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)
最小二乘法之正规方程
求解:
X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度太慢; 对于复杂的算法,不能使用正规方程求解(逻辑回归等)
损失函数直观图(单变量举例)
最小二乘法之梯度下降
以单变量中的w0,w1为例子:
α为学习速率,需要手动指定
表示方向
理解: 沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新W值
使用: 面对训练数据规模十分庞大的任务
sklearn线性回归正规方程、梯度下降API
-
sklearn.linear_model.LinearRegression
正规方程
-
sklearn.linear_model.SGDRegressor
梯度下降
sklearn.linear_model.LinearRegression()
普通最小二乘线性回归
coef_ :回归系数
sklearn.linear_model.SGDRegressor( )
通过使用SGD最小化线性模型
coef_ :回归系数
线性回归实例
1、sklearn线性回归正规方程、梯度下降API
2、波士顿房价数据集分析流程
波士顿房价数据案例分析流程
1、波士顿地区房价数据获取
2、波士顿地区房价数据分割
3、训练与测试数据标准化处理
4、使用最简单的线性回归模型LinearRegression和
梯度下降估计SGDRegressor对房价进行预测
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
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)
print(y_train,y_test)
# 进行标准化处理(特征值和目标值都进行标准化)
# 实例化两个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预测
# 正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train, y_train)
# 回归系数
print(lr.coef_)
# 预测测试集的房子价格(将数据反标准化)
y_predict = std_y.inverse_transform(lr.predict(x_test))
print("测试集里面每个样本的预测价格是: ", y_predict.tolist())
# 均方误差
print("梯度下降的均方误差: ",mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))
return None
if __name__=="__main__":
mylinear()
回归性能评估
(均方误差(Mean Squared Error)MSE) 评价机制:
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error
- mean_squared_error(y_true, y_pred)
- 均方误差回归损失
- y_true:真实值
- y_pred:预测值
- return:浮点数结果
1、LinearRegression与SGDRegressor评估
2、特点:线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之
间关系的前提下,我们仍然使用线性回归器作为大多数
系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor
过拟合与欠拟合
过拟合
一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合
一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
·对线性模型进行训练学习会变成复杂模型
欠拟合原因以及解决办法
-
原因:
学习到数据的特征过少 -
解决办法:
增加数据的特征数量
过拟合原因以及解决办法
-
原因:
原始特征过多,存在一些嘈杂特征,
模型过于复杂是因为模型尝试去兼顾
各个测试数据点 -
解决办法:
进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化(了解)
L2正则化
-
作用:可以使得W的每个元素都很小,都接近于0
-
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象
带有正则化的线性回归-Ridge(岭回归)
sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)
具有l2正则化的线性最小二乘法
alpha:正则化力度
coef_:回归系数
正则化图解:
线性回归 LinearRegression与Ridge对比
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让
估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研
究中有较大的实用价值。
from sklearn.linear_model import Ridge
rd = Ridge()
rd.fit(x_train, y_train)
print(rd.coef_)
# 预测测试集的房子价格(将数据反标准化)
y_rd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("岭回归测试集里面每个房子的预测价格是: ", y_rd_predict.tolist())
# 均方误差
print("岭回归的均方误差: ", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
sklearn中模型的保存和加载
https://blog.csdn.net/weixin_45875105/article/details/107844942
分类算法-逻辑回归
应用
-
广告点击率
-
判断用户的性别
-
预测用户是否会购买给定的商品类
-
判断一条评论是正面的还是负面的
逻辑回归是解决二分类问题的利器
输入:ℎ(w)= w0+w1x1+w2x2+…= wTx(单个样本)
sigmoid函数
逻辑回归公式
公式:
输出:[0,1]区间的概率值,默认0.5作为阀值
注:
σ(x)为sigmoid函数
逻辑回归的损失函数、优化(了解)
与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解
对数似然损失函数:
完整的损失函数:
cost损失的值越小,那么预测的类别准确度更高
当y=1时:
sklearn逻辑回归API
sklearn.linear_model.LogisticRegression
sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
- Logistic回归分类器
- coef_:回归系数
LogisticRegression回归案例
良/恶性乳腺癌肿数据
原始数据的下载地址:
https://archive.ics.uci.edu/ml/machine-learning-databases/
数据描述
(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。
pandas使用
-
pd.read_csv(’’,names=column_names)
column_names:指定类别名字,[‘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’]
return:数据 -
replace(to_replace=’’,value=):返回数据
-
dropna():返回数据
多分类问题
逻辑回归解决办法:1V1,1Vall
softmax方法-逻辑回归在多分类问题上的推广(神经网络算法中)
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
import pandas as pd
import numpy as np
def logistic():
"""
逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
:return: None
"""
# 构造列标签名字
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)
# 缺失值进行处理
data = data.replace(to_replace='?',value=np.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)
# 逻辑回归预测
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()