宏观概念
机器学习建立模块化思维,同时python也建立调包导包思维(不是在调包,就是在导包)
机器学习的模块化是很严格的,第一块:(pandas数据清洗)导入数据(后续pandas还是另讲吧);第二块:划分数据集(人工对数据集进行一部分的筛选),第三块:特征工程(标注化归一化;特征选择与特征降维;在把数据转换为计算机认识的数据,中文英文文本,语音,字典列表等等数据转换)第四块:建立预估器,根据算法与数据加载模型(前面提到的KNN,随机森林,梯度下降,岭回归,拉索回归,逻辑回归等等都是算法,算法很厉害,但更多也只是代码的一个包,一个模块)第五块:保存模型与模型评估
到现在我感觉我们做的其实就是模型的部署与微调,难点是理解模型和与时俱进以及多个模块的叠加,会有大量的算法出现,过了初学阶段要保持终身学习
岭回归
1.1岭回归的概念与损失函数公式
岭回归是失损函数通过添加所有权重的平方和的乘积(L2)来惩罚模型的复杂度。均方差除以2是因为方便求导,w_j指所有的权重系数, λ指惩罚型系数,又叫正则项力度。
1.2岭回归的特点
在梯度下降中(以随机梯度下降为例),希望模型收敛即梯度变化率最小(现实中很难等于0),加了惩罚项后,因为加了惩罚项的平方(方便运算)损失函数的值会变大,精度会减少,但是整个损失函数的值减少,那么W的值也会减少,减少系数估计的方差(特别是最小二乘法),让模型更加稳定,同时限制模型系数的大小,从而避免过拟合现象。
特点:1.岭回归不会将权重压缩到零,这意味着所有特征都会保留在模型中,但它们的权重会被缩小 2.适用于特征间存在多重共线性的情况 3.岭回归产生的模型通常更为平滑,因为它对所有特征都有影响。
1.3API的调用
具有L2正则化的线性回归-岭回归。
sklearn.linear_model.Ridge() 参数设置:
1.alpha, default=1.0,正则项力度(必须是非负浮点数。alpha 越大,正则化的影响越强。)2.fit_intercept, 是否计算偏置, default=True
3.solver, {‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’, ‘lbfgs’}, default=’auto’
当值为auto,并且数据庥、特征都比较大时,内部会随机梯度下降法
4.max_iterint, default=None,梯度解算器的最大迭代次数,默认为15000
(可能有人用过normalize,现在版本以及优化掉了,使用StandardScaler即可)
1.4实例分析
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing(data_home="./src")
x_train, x_test, y_train, y_test = train_test_split(housing.data, housing.target, random_state=22)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
estimator = Ridge(alpha=0.5, max_iter=10000)
estimator.fit(x_train, y_train)
print("权重系数为:\n", estimator.coef_)
print("偏置为:\n", estimator.intercept_)
y_predict = estimator.predict(x_test)
print("预测的数据集:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("均方误差为:\n", error)
拉索回归
2.1拉索回归概念与损失函数公式
Lasso回归是一种线性回归模型,它通过添加所有权重的绝对值之和(L1)来惩罚模型的复杂度。
Lasso回归的目标是最小化以下损失函数:(还是不同的算法)
其中:n 是样本数量,p 是特征的数量,y_i 是第 i 个样本的目标值,x_i 是第 i 个样本的特征向量,w是模型的参数向量,lambda 是正则化参数,控制正则化项的强度。
2.2拉索回归的特点与适用场景
特点:1.拉索回归可以将一些权重压缩到零,从而实现特征选择。这意味着模型最终可能只包含一部分特征。2.适用于特征数量远大于样本数量的情况,或者当特征间存在相关性时,可以从中选择最相关的特征。3.拉索回归产生的模型可能更简单,因为它会去除一些不重要的特征。
2.3API
sklearn.linear_model.Lasso() 参数设置:
-
alpha (float, default=1.0)2.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',则按照循环顺序选择坐标。
属性:
-
coef_ 系数向量或者矩阵,代表了每个特征的权重。
-
intercept_ 截距项(如果 fit_intercept=True)。
-
n_iter_ 实际使用的迭代次数。
-
n_features_in_ (int): 训练样本中特征的数量。
2.4实例分析
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
data = fetch_california_housing(data_home="./src")
X, y = data.data, data.target
X_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
print("权重系数为:\n", lasso.coef_)
print("偏置为:\n", lasso.intercept_)
y_predict = lasso.predict(x_test)
print("预测的数据集:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("均方误差为:\n", error)
逻辑回归
3.1逻辑回归概念
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。逻辑回归一般用于二分类问题,比如:是好瓜还是坏瓜(往下看,这里疑惑正常)
3.2逻辑回归原理
逻辑回归的输入是线性回归 的输出
线性回归: h(w)=w_1x_1+w_2x_2+....+b
sigmoid激活函数 :f(x)=\frac{1}{1+e^{-x}}
sigmoid函数的值是在[0,1]区间中的一个概率值,默认为0.5为阈值可以自己设定,大于0.5认为是正例,小于则认为是负例
把上面的h(w) 线性的输出再输入到sigmoid函数当中 f(w)=\frac{1}{1+e^{-h(w)}}
损失函数:
区别示意图:
其实就把结果经过激活函数,然后按照阈值分类
3.3API
sklearn.linear_model.LogisticRegression() 参数设置:
fit_intercept bool, default=True 指定是否计算截距
max_iter int, default=100 最大迭代次数。迭代达到此数目后,即使未收敛也会停止。
模型对象:
.coef_ 权重 .intercept_ 偏置 predict()预测分类 predict_proba()预测分类(对应的概率)
score()准确率
3.4实例分析
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)
X=X[y!=2]
y=y[y!=2]
print(y)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=33)
print(X_train.shape,y_train.shape)
model=LogisticRegression()
model.fit(X_train,y_train)
print(model.coef_)
print(model.intercept_)
y_predict=model.predict(X_test)
print(y_predict)
print(y_test)
proba=model.predict_proba(X_test)
print(model.score(X_test,y_test))
3.5补充
sigmoid激活函数是人们模仿人类神经元激活的过程,即一点一点激活,没激活0,激活了1,但是23年(还是22年)发文证明了其实并没有更好的表现,relu更好用一点