目录
sklearn%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D-toc" style="margin-left:40px;">一、sklearn梯度下降
1、BGD
2、SGD
3、MBGD
二、欠拟合 过拟合
1、欠拟合
2、过拟合
3、正则化
三、岭回归 Ridge
四、拉索回归 Lasso
五、逻辑回归
分类补充:kmeans聚类
回归补充:SVM支持向量机
一、sklearn梯度下降
前一天学到,官方使用的梯度下降API常用有三种: 批量梯度下降BGD(Batch Gradient Descent)、小批量梯度下降MBGD(Mini-BatchGradient Descent)、随机梯度下降SGD(Stochastic Gradient Descent)。
1、BGD
批量梯度下降(BGD)的基本思想是在每个迭代步骤中使用所有训练样本来计算损失函数的梯度,并据此更新模型参数。
更新规则
n是特征数量,是学习率
特点
-
准确性:由于使用了所有训练样本,所以得到的梯度是最准确的,这有助于找到全局最小值。
-
计算成本:每次更新都需要遍历整个数据集,因此计算量较大,特别是在数据集很大的情况下。
-
收敛速度:虽然每一步的更新都是准确的,但由于计算成本较高,实际收敛到最小值的速度可能不如其他方法快。
-
内存需求:需要在内存中存储整个数据集,对于大型数据集来说可能成为一个问题。
使用场景
-
小数据集:当数据集较小时,批量梯度下降是一个不错的选择,因为它能保证较好的收敛性和准确性。
-
不需要实时更新:如果模型不需要实时更新,例如在离线训练场景下,批量梯度下降是一个合理的选择。
2、SGD
随机梯度下降(SGD)是一种常用的优化算法,SGD 每一步更新参数时仅使用单个训练样本,这使得它更加灵活且计算效率更高,特别是在处理大规模数据集时。
更新规则
注意
-
学习率 需要适当设置,太大会导致算法不收敛,太小则收敛速度慢。
-
随机性 每次迭代都从训练集中随机选择一个样本,这有助于避免陷入局部最小值。
-
停止条件 可以是达到预定的最大迭代次数,或者梯度的范数小于某个阈值。
api
sklearn.linear_model.SGDRegressor()
功能:梯度下降法线性回归
参数:
loss: 损失函数,默认为 ’squared_error’
fit_intercept: 是否计算偏置, default=True
eta0: float, default=0.01学习率初始值
learning_rate: str, default=’invscaling’
The learning rate schedule:
‘constant’: eta = eta0 学习率为eta0设置的值,保持不变
‘optimal’: eta = 1.0 / (alpha * (t + t0))
‘invscaling’: eta = eta0 / pow(t, power_t)
‘adaptive’: eta = eta0, 学习率由eta0开始,逐步变小
max_iter: int, default=1000 经过训练数据的最大次数(又名epoch)
shuffle=True 每批次是否洗牌
penalty: {‘l2’, ‘l1’, ‘elasticnet’, None}, default=’l2’
要使用的惩罚(又称正则化项)。默认为' l2 ',这是线性SVM模型的标准正则化器。' l1 '和'
elasticnet '可能会给模型(特征选择)带来' l2 '无法实现的稀疏性。当设置为None时,不添加惩罚。
属性:
coef_ 回归后的权重系数
intercept_ 偏置
# 随机梯度下降SGD
# 加利福尼亚住房数据集 回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
import pandas as pd# 加载数据
housing = fetch_california_housing(data_home="../src")
x = housing.data
y = housing.target
# print(housing)# 划分数据
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size=0.2)
# 标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 线性回归预估器 'constant' 学习率为eta0设置的值,保持不变
estimator = SGDRegressor()
estimator.fit(x_train,y_train)print(f'权重系数:\n{estimator.coef_}')
print(f'偏置:\n{estimator.intercept_}')# 模型预测
y_predict = estimator.predict(x_test)
print(f'预测的数据集:\n{y_predict}')
print(f'得分:\n{estimator.score(x_test,y_test)}')
error = mean_squared_error(y_test,y_predict)
print(f'均方误差:\n{error}')
3、MBGD
小批量梯度下降(MBGD)是一种介于批量梯度下降(BGD)与随机梯度下降(SGD)之间的优化算法,它的基本思想是在每个迭代步骤中使用一小部分(即“小批量”)训练样本来计算损失函数的梯度,并据此更新模型参数。这样做的好处在于能够减少计算资源的需求,同时保持一定程度的梯度准确性。
更新规则
特点
-
计算效率:相比于批量梯度下降,小批量梯度下降每次更新只需要处理一部分数据,减少了计算成本。
-
梯度估计:相比于随机梯度下降,小批量梯度下降提供了更准确的梯度估计,这有助于更稳定地接近最小值。
-
内存需求:相比批量梯度下降,小批量梯度下降降低了内存需求,但仍然比随机梯度下降要高。
-
收敛速度与稳定性:小批量梯度下降能够在保持较快的收敛速度的同时,维持相对较高的稳定性。
使用场景
-
中等规模数据集:当数据集大小适中时,小批量梯度下降是一个很好的折衷方案,既能够高效处理数据,又能够保持良好的收敛性。
-
在线学习:在数据流式到达的场景下,小批量梯度下降可以有效地处理新到来的数据批次。
-
分布式环境:在分布式计算环境中,小批量梯度下降可以更容易地在多台机器上并行执行。
# 小批量梯度下降MBGD
# 加利福尼亚住房数据集 回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
import pandas as pd
import math# 加载数据
housing = fetch_california_housing(data_home="../src")
x = housing.data
y = housing.target
# print(housing)# 划分数据
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size=0.2)
# 标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)def train():# 配置训练参数eta0 = 0.001 # 学习lrepoch = 20 # 迭代次数batch_size = 16 # 小批量大小n_sample = len(x_train) # 训练样本数量estimator = SGDRegressor()for i in range(epoch):n_batch = math.ceil(n_sample / batch_size)for j in range(n_batch):start = j*batch_sizeend = min((j+1)*batch_size, n_sample)x_train[start:end]estimator.partial_fit(x_train[start:end], y_train[start:end]) # 更新模型权重# 一轮训练结束y_predict = estimator.predict(x_test)mse = mean_squared_error(y_predict,y_test)print(f'第{i}轮,均方误差为:{mse}')train()
二、欠拟合 过拟合
1、欠拟合
欠拟合是指模型在训练数据上表现不佳,同时在新的未见过的数据上也表现不佳。这通常发生在模型过于简单,无法捕捉数据中的复杂模式时。
表现特征:
-
训练误差较高。
-
测试误差同样较高。
-
模型可能过于简化,不能充分学习训练数据中的模式。
2、过拟合
过拟合是指模型在训练数据上表现得非常好,但在新的未见过的数据上表现较差。这通常发生在模型过于复杂,以至于它不仅学习了数据中的真实模式,还学习了噪声和异常值。
表现特征:
-
训练误差非常低。
-
测试误差较高。
-
模型可能过于复杂,以至于它对训练数据进行了过度拟合。
3、正则化
正则化就是防止过拟合,增加模型的鲁棒性,就像计算机软件在面临攻击、网络过载等情况下能够不死机不崩溃,这就是软件的鲁棒性,鲁棒性调优就是让模型拥有更好的鲁棒性,也就是让模型的泛化能力和推广能力更加的强大。
正则化(鲁棒性调优)的本质就是牺牲模型在训练集上的正确率来提高推广、泛化能力,w在数值上越小越好,这样能抵抗数值的扰动。同时为了保证模型的正确率,w又不能极小。因此将原来的损失函数加上一个惩罚项使得计算出来的模型w相对小一些,就是正则化。
损失函数就是原来固有的损失函数,比如回归问题中通常是MSE,然后在加上一部分惩罚项来使得计算出来的模型w相对小一些来带来泛化能力。
常用的惩罚项有L1正则项或者L2正则项:
对应曼哈顿距离;
对应欧式距离。
三、岭回归 Ridge
岭回归是失损函数通过添加所有权重的平方和的乘积(L2)来惩罚模型的复杂度。
特点
api
sklearn.linear_model.Ridge()
1 参数:
(1)alpha, default=1.0,正则项力度
(2)fit_intercept, 是否计算偏置, default=True
(3)solver, {‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’, ‘lbfgs’}, default=’auto’
当值为auto,并且数据量、特征都比较大时,内部会随机梯度下降法。
(4)normalize:,default=True, 数据进行标准化,如果特征工程中已经做过标准化,这里就该设置为False
(5)max_iterint, default=None,梯度解算器的最大迭代次数,默认为15000
2 属性
coef_ 回归后的权重系数
intercept_ 偏置
说明:SGDRegressor也可以做岭回归的事情,比如SGDRegressor(penalty='l2',loss="squared_loss"),但是其中梯度下降法有些不同。所以推荐使用Ridge实现岭回归
# 加利福尼亚住房数据集 小批量梯度下降 岭回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
import pandas as pd
import math# 加载数据
housing = fetch_california_housing(data_home="../src")
x = housing.data
y = housing.target
# print(housing)# 划分数据
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size=0.2)def train():# 配置训练参数eta0 = 0.001 # 学习lrepoch = 20 # 迭代次数batch_size = 16 # 小批量大小n_sample = len(x_train) # 训练样本数量estimator = Ridge()estimator.fit(x_train, y_train)s = estimator.score(x_test, y_test)print(s)train()
四、拉索回归 Lasso
Lasso回归是一种线性回归模型,它通过添加所有权重的绝对值之和(L1)来惩罚模型的复杂度。
损失函数:
特点:
-
拉索回归可以将一些权重压缩到零,从而实现特征选择。这意味着模型最终可能只包含一部分特征。
-
适用于特征数量远大于样本数量的情况,或者当特征间存在相关性时,可以从中选择最相关的特征。
-
拉索回归产生的模型可能更简单,因为它会去除一些不重要的特征。
api
sklearn.linear_model.Lasso()
参数
alpha (float, default=1.0):
控制正则化强度;必须是非负浮点数。较大的 alpha 增加了正则化强度。
fit_intercept (bool, default=True):
是否计算此模型的截距。如果设置为 False,则不会使用截距(即数据应该已经被居中)。
precompute (bool or array-like, default=False):
如果为 True,则使用预计算的 Gram 矩阵来加速计算。如果为数组,则使用提供的 Gram 矩阵。
copy_X (bool, default=True):
如果为 True,则复制数据 X,否则可能对其进行修改。
max_iter (int, default=1000):
最大迭代次数。
tol (float, default=1e-4):
精度阈值。如果更新后的系数向量减去之前的系数向量的无穷范数除以 1 加上更新后的系数向量的无穷范数小于 tol,则认为收敛。
warm_start (bool, default=False):
当设置为 True 时,再次调用 fit 方法会重新使用之前调用 fit 方法的结果作为初始估计值,而不是清零它们。
positive (bool, default=False):
当设置为 True 时,强制系数为非负。
random_state (int, RandomState instance, default=None):
随机数生成器的状态。用于随机初始化坐标下降算法中的随机选择。
selection ({'cyclic', 'random'}, default='cyclic'):
如果设置为 'random',则随机选择坐标进行更新。如果设置为 'cyclic',则按照循环顺序选择坐标。
# 加利福尼亚住房数据集 拉索回归预测
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error
import mathdef data_load():data = fetch_california_housing(data_home="../src")x_train,x_test,y_train,y_test = train_test_split(data.data, data.target,test_size=0.2,random_state=66)return x_train,x_test,y_train,y_testdef train(x_train,y_train):estimator = Lasso(alpha=0.01)estimator.fit(x_train,y_train)return estimatordef test(estimator,x_test,y_test):y_predict = estimator.predict(x_test)mse = mean_squared_error(y_test,y_predict)rmse = math.sqrt(mse)return rmsex_train,x_test,y_train,y_test = data_load()
estimator = train(x_train,y_train)
s = test(estimator,x_test,y_test)
print(f'误差为\n{s}')
score = estimator.score(x_test,y_test)
print(f'模型准确率为\n{score}')
print(f'系数为{estimator.coef_}')
五、逻辑回归
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。逻辑回归一般用于二分类问题。
原理
线性回归:
sigmoid激活函数 :
h(w) 线性的输出再输入到sigmoid函数当中:
损失函数:
关于损失函数的推导,可参考文章逻辑回归(Logistic Regression)
要使loss函数最小,即 y=1时,我们希望越大越好, y=0时,希望越小越好,
综合0和1的损失函数:
然后使用梯度下降算法,去减少损失函数的值,这样去更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。
api
sklearn.linear_model.LogisticRegression()
参数:
fit_intercept bool, default=True 指定是否计算截距
max_iter int, default=100 最大迭代次数。迭代达到此数目后,即使未收敛也会停止。
模型对象:
.coef_ 权重
.intercept_ 偏置
predict()预测分类
predict_proba()预测分类(对应的概率)
score()准确率
# 鸢尾花数据集 逻辑回归
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionx,y = load_iris(return_X_y=True)index = y!=2
x = x[index]
y = y[index]
# print(y)
# print(x.shape)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=66)
estimator = LogisticRegression()
estimator.fit(x_train,y_train)
x_new = [[5,2.9,4,1.5]]
y_new = estimator.predict(x_new)
print(f'新值为:{y_new}')
y_predict = estimator.predict(x_test)
print(f'预测值:{y_predict}')
# 预测分类对应的概率
proba=estimator.predict_proba(x_test)
print(proba)
# 评估模型
print(f'得分:{estimator.score(x_test,y_test)}')
分类补充:kmeans聚类
# kmeans聚类
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 创建数据
data = np.random.randint(0,100, (100,2))# 初始化 KMeans 模型
clusters=8 # 聚类数量
kmeans = KMeans(clusters)
kmeans.fit(data)for i in range(clusters):point = data[kmeans.labels_==i] # 获取每个类别的点plt.scatter(point[:,0], point[:,1]) # 画出每个类别plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1])
plt.show()
回归补充:SVM支持向量机
# svm支持向量机
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitx,y = load_iris(return_X_y=True)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
clf = SVC()
clf.fit(x_train,y_train)
s = clf.score(x_test,y_test)
print(s)
print(clf.predict([[5.1,3.5,1.4,0.2]]))