机器学习教程八:逻辑回归算法实战
sklearn.linear_model.LogisticRegression
链接直达:sklearn.linear_model.LogisticRegression — scikit-learn 1.5.dev0 documentation
下面我们来看一看模型的参数和方法。
参数
- penalty:指定正则化项的范数。可选值有:’l1’(L1正则化),’l2’(L2正则化),’elasticnet’(弹性网络正则化)和None(无正则化)。默认为’l2’。其中,L1正则化会促使模型参数稀疏化,L2正则化会使参数趋向于较小的值,弹性网络正则化结合了L1和L2正则化。
- dual:表示是否使用对偶(受限)或原始(正则化)形式进行求解。对偶形式仅适用于使用liblinear求解器的L2正则化。当样本数大于特征数时,建议设置dual=False。默认为False。
- tol:停止标准的容差。当模型的变化小于容差时,停止迭代。默认为1e-4。
- C:正则化强度的倒数。必须是正的浮点数。较小的值对应更强的正则化。类似于支持向量机中的惩罚参数。默认为1.0。
- fit_intercept:是否在决策函数中添加常数项(截距)。默认为True。
- intercept_scaling:仅在使用’liblinear’求解器且fit_intercept设置为True时有用。在这种情况下,输入向量x会变为[x,self.intercept_scaling]。即向实例向量添加一个“合成”特征,该特征的常数值等于intercept_scaling。截距变为intercept_scaling * synthetic_feature_weight。
- class_weight:类别权重,可以是一个字典{class_label: weight}或字符串’balanced’。如果不提供,则假定所有类别的权重都为1。”balanced”模式会根据输入数据中每个类别的频率自动调整权重,使其与样本的类别频率成反比。
- random_state:用于在solver为’sag’、’saga’或’liblinear’时对数据进行洗牌。它接受一个整数或RandomState实例作为参数。
- solver:优化问题中使用的算法。默认为’lbfgs’。选择求解器时,需要考虑以下几个方面:
- 对于小数据集,’liblinear’是一个不错的选择,而对于大数据集,’sag’和’saga’更快;
- 对于多类别问题,只有’newton-cg’、’sag’、’saga’和’lbfgs’支持多项式损失;
- ‘liblinear’仅支持一对多策略。
- 对于样本数远大于特征数的情况,特别是具有稀有类别的独热编码分类特征,’newton-cholesky’是一个不错的选择。请注意,它仅适用于二元分类和多类别分类的一对多归约。要注意的是,该求解器的内存使用量与特征数的平方成正比,因为它显式计算Hessian矩阵。
- max_iter:求解器收敛的最大迭代次数。默认为100。如果求解器在达到最大迭代次数之前已经收敛,则会提前停止。
- multi_class:多类别分类的方式。可选值有’auto’、’ovr’和’multinomial’。如果选择’ovr’,则为每个标签拟合一个二元分类问题。如果选择’multinomial’,则最小化的损失是在整个概率分布上拟合的多项式损失,即使数据是二元的。当solver=’liblinear’时,不可用’multinomial’选项。’auto’选项会根据数据是否二元或solver是否为’liblinear’来自动选择分类方式。
- verbose:对于liblinear和lbfgs求解器,设置verbose为正数以打印详细信息。
- warm_start:当设置为True时,重用上一次fit调用的解作为初始化,否则,只是清除上一次的解。对于liblinear求解器无效。详见术语表。
- n_jobs:如果multi_class=’ovr’,则在类别并行化时使用的CPU核心数。当求解器设置为’liblinear’时,无论是否指定了’multi_class’,此参数都会被忽略。None表示使用1个核心,除非在joblib.parallel_backend上下文中。-1表示使用所有处理器。有关更多详细信息,请参阅术语表。
- l1_ratio:Elastic-Net混合参数,取值范围为0 <= l1_ratio <= 1。仅在penalty=’elasticnet’时使用。设置l1_ratio=0等效于使用penalty=’l2’,而设置l1_ratio=1等效于使用penalty=’l1’。对于0 < l1_ratio < 1,惩罚项是L1和L2的组合。
其中常用的一些参数,使用粗体进行表明。
方法
下面对方法进行介绍
- decision_function(X):为样本预测分类的置信度得分。返回一个数组,数组的形状为(n_samples, ),其中n_samples是输入样本的数量。
- densify():将系数矩阵转换为密集数组格式。
- fit(X, y[, sample_weight]):根据给定的训练数据对模型进行拟合。
- get_metadata_routing():获取此对象的元数据路由。
- get_params([deep]):获取此估计器的参数。
- predict(X):对样本X进行分类预测,返回预测的类标签。
- predict_log_proba(X):预测样本X的对数概率估计。
- predict_proba(X):预测样本X的概率估计。
- score(X, y[, sample_weight]):返回给定测试数据和标签的平均准确率。
- set_fit_request(*[, sample_weight]):请求传递给fit方法的元数据。
- set_params(**params):设置此估计器的参数。
- set_score_request(*[, sample_weight]):请求传递给score方法的元数据。
- sparsify():将系数矩阵转换为稀疏格式。
这些方法提供了对逻辑回归分类器进行训练、预测和评估的功能,并可以操作模型的参数和元数据。常用的方法同样使用黑体进行显示。
下面我们先使用逻辑回归识别鸢尾花数据集做个开胃菜。
逻辑回归分类鸢尾花
给出下面代码,可以看到全部分类正确。
'''
@File : logistic regression.py
@Contact : zhangzhilong2022@gmail.com
@Modify Time 2024/3/8 17:47
@Author huahai2022
@Desciption
'''
# -*- coding: utf-8 -*-
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import accuracy_score
# 加载sklearn内置的iris鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
print('Sample num: ', len(y))#150
# 将原始数据集随机切分成两部分,作为训练集和测试集,其中测试集占总样本30%。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 设置模型参数并使用训练集训练模型。
clf = LogisticRegression(C=1.0, penalty='l2',tol=1e-6)
print(clf)
# 训练模型
clf.fit(X_train, y_train)
# 使用测试集预测结果
ans = clf.predict(X_test)
print("Accuracy:",accuracy_score(y_test,ans))
# 100%
逻辑回归识别手写数字
给出下面的代码:这里给出的最大迭代次数为10000,因为我尝试了其它的值,模型没有达到收敛的效果。
'''
@File : logistic regression2.py
@Contact : zhangzhilong2022@gmail.com
@Modify Time 2024/3/8 17:54
@Author huahai2022
@Desciption
'''
from matplotlib import pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 加载MNIST数据集
digits = datasets.load_digits()
X = digits.data
print(X.shape)
y = digits.target
print(y.shape)
plt.imshow(X[0].reshape(8, 8),cmap='gray')
plt.show()
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))