以下内容是在学习过程中的一些笔记,难免会有错误和纰漏的地方。如果造成任何困扰,很抱歉。
回归,指研究一组随机变量 (Y1 ,Y2 ,…,Yi) 和另一组 (X1,X2,…,Xk) 变量之间关系的统计分析方法,回归分析是一种数学模型,当因变量和自变量为线性关系时,它是一种特殊的线性模型。
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jObYK71m-1668351864196)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习入门-线性回归模型公式-3.png)]
b为误差服从均值为0的正态分布,如果只有一个自变量的情况下就叫一元回归
,如果有多个自变量的情况下就叫多元回归
;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3zlQut0-1668351864197)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/多元线性回归的简单公式-1.png)]
回归的目的是预测数组型的目标值,其应用范围有股票预测
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c7INm1n0-1668351864197)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习-股票预测示例样图-1.png)]
天气、PM2.5、温湿度预测等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYJ2OuZy-1668351864197)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习-天气预测示例样图-1.png)]
不引用深度学习框架,通过简单的数学公式完成一元回归案例
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
np.random.seed(0)
area = 2.5 * np.random.randn(100) + 25
price = 25 * area + 5 + np.random.randint(20, 50, size=len(area))
data = np.array([area, price])
data = pd.DataFrame(data=data.T, columns=['area', 'price'])
# 绘图
# plt.scatter(data['area'], data['price'])
# plt.show()
W = sum(price * (area - np.mean(area))) / sum((area - np.mean(area)) ** 2)
b = np.mean(price) - W * np.mean(area)
# print("计算回归系数", W, b)
y_pred = W * area + b
# 绘图
plt.plot(area, y_pred, color='red', label="forecast")
plt.scatter(data['area'], data['price'], label="train")
plt.xlabel("areaX")
plt.ylabel("priceY")
plt.legend()
plt.show()
绘图输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ou2wqvTL-1668351864198)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/连续值预测-一元线性简单效果图-1.png)]
对于线性模型的定义公式为:f(x) = w0 + w1·x1 + w2·x2 + … + wn·xn
当通过矩阵表示时:f(x) = XW,W是根据要求得到的非输入式参数,X是输入的数据矩阵
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zb47VWUN-1668351864198)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/线性模型-W的矩阵-1.png)]
n代表一个数据有n个数据,m代表一共是m个数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLh4iytJ-1668351864198)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/线性模型-X的矩阵-1.png)]
那么数据集的数据矩阵为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfYqkfFM-1668351864199)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/线性模型-Y的矩阵-1.png)]
线性回归模型的最终目标就是找到参数 W 来使得 f(x) = XW 尽可能无限贴近 Y
本期示例将通过Sk-Learn实现线性回归的API,首先我们重新回忆机器学习的五大基本流程
通过该流程阅读如下代码
"""
机器学习流程
1.获取数据集
2.数据处理
3.特征工程
4.机器学习
5.模型评估
"""
from sklearn.linear_model import LinearRegression
# get dataset
x = [[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]
]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
# 实例化估计器
estimator = LinearRegression()
# 模型训练
estimator.fit(x, y)
# 系数coefficient:[0.3 0.7]
coefficient = estimator.coef_
print("coefficient:", coefficient)
# 预测
res = estimator.predict([[80, 100]])
print("预测结果:", res)
我们在进行线性预测时,往往会出现部分预测的结果和实际结果不符,比预期有一定的偏差,对于这种存在局部预测出现损失偏差的情况,我们将这个损失偏差衡量出来,并进行定义(损失函数转换矩阵写法)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gapASfDB-1668351864199)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/回归-损失函数的简单公式-1.png)]
简述其含义为:(预测值1 减去 真实值1)的平方 + …N
对于任何机器学习问题,都需要先明确损失函数,在遇到回归问题时,通常我们会直接想到如下的损失函数形式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8yCU30v-1668351864199)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/乌鸦坐飞机.png)]
梯度下降法是迭代法的一种,我们将这个思想比作是一个上下山的过程,可以用于求解最小二乘问题,是一个致力于找到函数极值点的算法,简单来说是为了计算函数中的最小值,是一种以抛物线的形式呈现,迭代公式为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYtVBF8S-1668351864200)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降法迭代公式-1.png)]
其中,-s(k)代表梯度负方向,pk代表梯度方向上的搜索步长,接下来我们将通过Tensorflow实现对于梯度下降的简单示例。
此为一元回归案例,准备数据集,Income为入参,Education为结果值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFGTR4b7-1668351864200)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/tensorflow-梯度下降示例-数据集-1.png)]
加载库与数据
import tensorflow as tf
import pandas as pd
# 加载数据 加载列
data = pd.read_csv(
'hello01.csv'
)
y = data.Education
x = data.Income
重点:导入Sequential模型 新增层,并查看我们构建的模型详情
model = tf.keras.Sequential()
model.add(
# 1:输出维度 1,:输入维度 是矩阵式
tf.keras.layers.Dense(1, input_shape=(1,))
)
# 打印模型详情
print(model.summary())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuzrND0C-1668351864200)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降法基础-构建模型打印详情-1.png)]
模型优化,通过选择损失函数,将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”
model.compile(
optimizer='adam',
loss='mse'
)
选择完损失函数后,接下来对模型进行训练,我们将训练过程打印出日志呈现,并实时查看其损失值的大小
# 记录训练过程 epochs:训练次数
# 训练过程中 loss值会不断下降直到无限逼近
history = model.fit(x, y, epochs=10000)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SRnD9TL-1668351864201)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降法基础-训练数据图-1.png)]
最后使用该模型实现预测
# 进行预测 连续值x 预测y
preTemp = model.predict(pd.Series([1233]))
print("结果是 = ", preTemp)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukyeK7w7-1668351864201)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降算法公式图-1.png)]
全梯度下降(FG)
计算训练集所有的样本误差
,对其求和再取平均值作为目标函数。
随机梯度下降(SG)
全梯度下降每迭代更新一次都需要计算所有的样本误差,样本数量大的情况下效率比较低,所以这个函数采取随机选择单个样本误差
来代入某一轮的计算,每一轮都重新随机获取样本误差。
每次只使用一个样本迭代,如果遇到噪声容易陷入局部最优解,即可能拟合度过高。
小批量梯度下降(mini-bantch)
兼顾上述两种的缺点,从训练样本集中随机抽取一部分(SG)作为小样本集,对这个小样本集采用FG迭代更新权重。
被抽出的小样本集所含样本个数称之为batch_size,通常设置为2的幂次方。
随机平均梯度下降(SAG)
对SG方法的进一步优化,SG解决了运算成本大的问题,但是对于训练结果常常不尽人意,因为每一轮的误差样本梯度数据更新都跟上一轮的数据无关。
随机随机平均梯度下降克服了这个问题,通过在内存里保存上一次的梯度,最终求所有梯度的平均值,进而更新参数。
关于sk-learn中的相关API
# fit_intercept 是否计算偏置 - 小规模数据(不能解决拟合问题)优选岭回归
sklearn.linear_model.LinearRegression(fit_intercept=True)
# SGDRegressor类实现了梯度下降,支持不同的损失函数和正则化惩罚项来拟合线性回归模型 - 大规模数据
sklearn.linear_model.SGDRegressor(
loss="squared_loss",
fit_intercept=True,
learning_rate="invscaling",
eta0=0.01
)
"""
机器学习流程
1.获取数据集
2.数据处理
3.特征工程
4.机器学习
5.模型聘雇
"""
# 告警抑制
import warnings
warnings.filterwarnings("ignore")
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# get dataset
boston = load_boston()
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 机器学习
est = LinearRegression()
est.fit(x_train, y_train)
# 模型评估
y_res = est.predict(x_test)
print("预测值:", y_res)
score = est.score(x_test, y_test)
print("准确率:", score)
# 损失函数
ret = mean_squared_error(y_test, y_res)
print("均方误差:", ret)
链接 |
---|
常见交叉验证方法汇总 - 知乎 (zhihu.com) |
Python机器学习笔记:Grid SearchCV(网格搜索) - 战争热诚 - 博客园 (cnblogs.com) |
降低模型的过拟合的好方法就是正则化这个模型(即限制它):模型有越少的自由度,就越难拟合数据。例如,正则化一个多项式模型,一个简单的方法就是减少多项式的阶数。
Ridge Regression 岭回归
线性回归的正则化版本,通过在原先的线性回归的cost方法中添加正则项。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQ4mBifU-1668351864201)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/线性回归-岭回归-公式-1.png)]
其中公式a=0则表示退化为线性回归。
Lasso 回归
线性回归的另外一个正则化版本,正则项为权值向量的ℓ1范数。
优势在于能够自动进行特征选择,并输出一个稀疏模型(只有少数特征的权重是非零的)。
Elastic Net 弹性网络
在岭回归和Lasso回归中进行了折中,通过参数变化可对公式进行控制。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLYXlQVb-1668351864202)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/线性回归-弹性网络2-公式-1.png)]
Early Stopping
在验证错误率达到最小值的时候停止训练。
通过波士顿房价预测案例演示岭回归
"""
机器学习流程
1.获取数据集
2.数据处理
3.特征工程
4.机器学习
5.模型聘雇
"""
# 告警抑制
import warnings
warnings.filterwarnings("ignore")
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# get dataset
boston = load_boston()
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.2)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 机器学习
# est = LinearRegression() # 线性回归
# est = Ridge(alpha=1) # 岭回归
est = RidgeCV(alphas=(0.001, 0.1, 1, 10, 100)) # 自动选择
est.fit(x_train, y_train)
# 模型评估
y_res = est.predict(x_test)
print("预测值:", y_res)
score = est.score(x_test, y_test)
print("准确率:", score)
# 损失函数
ret = mean_squared_error(y_test, y_res)
print("均方误差:", ret)
Logistic Regression - 属于机器学习中的入门的分类器,与线性回归不同,逻辑回归指的是 是与否的回答,并且搭配交叉熵损失函数,刻画实际输出与期望输出的距离,来得到最终答案。
使用多元非线性回归来预测离散型因变量的模型,尤其是对于二分类变量的预测,该模型是一种分类技术
。
如果在线性模型的基础上做二分类任务,实际上就是在最终的输出结果上套上一层函数,最简单的就是“单位阶跃函数”(unit-step function),通过结果输入进行逻辑分类
逻辑回归的输入是线性回归的输出。
逻辑回归的损失,称之为对数似然损失,公式如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nkS3G2VW-1668351864202)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/逻辑回归-损失函数的公式-1.png)]
完整的公式代入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUeOKkK4-1668351864202)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/逻辑回归-完整的损失函数的公式-1.png)]
借助log思想,进行完成真实值等于0、等于1的两种情况的划分;优化后提升原本属于1类别的概率,降低原本是0类别的概率。
api介绍
# solver可选参数:{liblinear,sag,saga,newton-cg,lbfgs};
# ----
# 默认是liblinear 用于优化问题的算法
# 小数据集使用liblinear 如大数据集则建议使用sag、sags
# 对于多类问题 只有newton-cg、sag、sags、lbfgs可以处理多项损失 liblinear只能处理一对多分类(one-versus-rest)
# ----
# penalty:正则化种类
# C:正则化力度
sklearn.linear_model.LogisticRegression(solver='liblinear', penalty='l2', C=1.0)
# LogisticRegression方法相当于SGDRegressor(loss='log',penalty='l2')
# SGDRegressor实现了普通的随机梯度下降 而LogisticRegression实现随机平均梯度下降
癌症分类预测-良/恶性乳腺癌肿瘤。
下载原始数据集
import pandas as pd
data = pd.read_csv(
"https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
names=names)
完整代码
"""
机器学习流程
1.获取数据集
2.数据处理
3.特征工程
4.机器学习
5.模型聘雇
"""
# 告警抑制
import warnings
warnings.filterwarnings("ignore")
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
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 数据集获取
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']
data = pd.read_csv(
"https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
names=names)
print("data.head() = ", data.head())
# 数据预处理 将缺失值进行字符替换
data = data.replace(to_replace="?", value=np.NaN)
data = data.dropna()
# 特征选择
x = data.iloc[:, 1:10]
print("x.head() = ", x.head())
y = data["Class"]
print("y.head() = ", y.head())
# 划分测试集/训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 特征工程(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 机器学习(逻辑回归)
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 模型评估
y_predict = estimator.predict(x_test)
print("y_predict = ", y_predict)
estimator.score(x_test, y_test)
over
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PdWFDwNf-1668351864203)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/小星球-1.png)]