9.逻辑回归实现
约 1179 字大约 4 分钟
2025-09-20

损失函数不能得到最优解析解。 这里我们需要使用梯度解决此类问题。
正则化
目的: 防止过拟合 能防止过拟合的原因:
- 减少参数数量: 减少参数数量可以降低模型复杂度,从而防止过拟合。
- 正则化项: 正则化项是一种惩罚项,使得模型参数的范数(权重向量的模长)小于某个值,从而防止过拟合。
J(w)=⋯+Δ
L1范式:Δ=λ∣∣w∣∣1
L2范式:Δ=21λ∣∣w∣∣2
弹性网络:L1+L2范式:Δ=λ∣∣w∣∣1+21λ∣∣w∣∣2
import numpy as np
from matplotlib import pyplot as pltfrom sklearn.model_selection import train_test_split
from sklearn.datasets import make_classificationx,y = make_classification(
n_samples=200,
n_features=2,
n_redundant=0,
n_classes=2,
n_clusters_per_class=1,
random_state=1024
)
x.shape,y.shape运行结果
((200, 2), (200,))
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42,stratify=y)plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(x_train,y_train)
clf.score(x_test,y_test)运行结果
0.9
clf.predict(x_test)运行结果
array([0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0])
# 测试对应的概率,左右相加为1
clf.predict_proba(x_test)[:5]运行结果
array([[7.88202569e-01, 2.11797431e-01], [5.57759077e-01, 4.42240923e-01], [2.06196173e-01, 7.93803827e-01], [5.22160287e-04, 9.99477840e-01], [8.57662157e-01, 1.42337843e-01]])
# 找到较大的那个索引
np.argmax(clf.predict_proba(x_test),axis=1)运行结果
array([0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype=int64)
超参数设置和搜索
from sklearn.model_selection import GridSearchCV
params = [
{
'penalty': ['l2', 'l1'],
'C': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000],
'solver': ['liblinear']
},
{
'penalty': ['none'],
'C': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000],
'solver': ['lbfgs']
},
{
'penalty': ['elasticnet'],
'C': [0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000],
'l1_ratio': [0, 0.25, 0.5, 0.75, 1],
'solver': ['saga'],
'max_iter': [200]
}
]
grid = GridSearchCV(
estimator=LogisticRegression(),
param_grid=params,
n_jobs=-1
)
grid.fit(x_train,y_train)这些参数通常用于机器学习中的逻辑回归(Logistic Regression)或类似模型的超参数优化,特别是针对不同的正则化方法和求解器的选择。以下是每个参数的详细解释:
- penalty 含义:正则化项的类型,用于控制模型的复杂度以防止过拟合。 值: 'none':表示不使用正则化。 'l2':L2正则化(又称岭回归,Ridge),惩罚参数权重的平方和。 'l1':L1正则化(又称Lasso),惩罚参数权重的绝对值和,会导致稀疏解。 'elasticnet':L1和L2正则化的组合,惩罚权重的绝对值和平方和的加权组合。
- C 含义:正则化强度的倒数,也称为反向正则化系数。C越大,正则化强度越弱;C越小,正则化强度越强。 值:[0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000] 可以看出,这是一个对数尺度的网格搜索范围。
- solver 含义:优化算法的求解器,用于找到逻辑回归模型的最优参数。 值: 'liblinear':一个针对线性分类问题的高效求解器,适用于小规模数据和 L1 或 L2 正则化。 'lbfgs':拟牛顿法(Limited-memory BFGS),适用于无正则化或 L2 正则化的情况。 'saga':一种高效的随机优化方法,支持 L2 和 L1 以及弹性网络正则化。
- l1_ratio 含义:仅在使用 'elasticnet' 正则化时有效,表示 L1 和 L2 正则化在弹性网络中的权重比例。 值:[0, 0.25, 0.5, 0.75, 1] 如果 l1_ratio = 0,等价于纯 L2 正则化。 如果 l1_ratio = 1,等价于纯 L1 正则化。 中间值表示 L1 和 L2 的组合,比例由 l1_ratio 决定。
- max_iter 含义:迭代次数的最大值,指优化算法在停止前允许的最大迭代次数。 值:[200] 设置为一个具体的数值(例如 200),以确保算法能够收敛。 总结:参数设置的含义 不同正则化方法的选择: 使用 penalty 参数选择正则化类型(L1、L2 或弹性网络)。 使用 C 参数调节正则化强度。 求解器的选择: 根据正则化类型选择合适的求解器(如 'liblinear'、'lbfgs' 或 'saga')。 优化细节的调整: 使用 l1_ratio 调控 L1 和 L2 正则化的比例。 使用 max_iter 控制迭代次数,确保算法收敛。 这些参数组合通常用于网格搜索(Grid Search)或随机搜索(Random Search),以找到最优的模型参数。
grid.best_score_运行结果
0.95
grid.best_estimator_.score(x_test,y_test)运行结果
0.9
grid.best_params_运行结果
{'C': 1, 'penalty': 'l2', 'solver': 'liblinear'} 