目录
逻辑回归的介绍
逻辑回归是一种常用的机器学习算法。逻辑回归基于线性回归的概念,通过引入逻辑函数(或称为sigmoid函数)将线性模型的输出映射到[0, 1]之间,从而实现对概率的建模。
逻辑回归的应用情景
逻辑回归在多个领域都有广泛的应用,主要包括但不限于以下几个方面:
- 医学领域:医学研究人员使用逻辑回归来识别和预测患某种疾病的概率。
- 金融领域:银行和金融机构经常使用逻辑回归来评估客户的信用风险。
- 市场营销:市场营销人员可以利用逻辑回归预测客户购买某种产品或参与某种促销活动的概率。
- 社交媒体和互联网广告:社交媒体平台通过分析用户的浏览历史、点赞和分享等行为数据,使用逻辑回归预测用户可能感兴趣的内容,提高内容推荐的准确性和用户满意度。
逻辑回归的原理
逻辑回归的原理可以概括为以下几个步骤:
- 定义线性模型(输入):假设待分类的数据可以由一个线性模型表示,即通过对特征进行线性组合,得到一个预测值。线性模型的表达式通常为 (z = wX + b),其中 (w) 是权重向量,(X) 是特征向量,(b) 是偏置项。
- 定义逻辑函数:使用逻辑函数(sigmoid函数)将线性模型的输出映射到[0, 1]的概率范围内。sigmoid函数的表达式为 (f(z) = \frac{1}{1 + e^{-z}}),其中 (z) 是线性模型的输出。
- 损失以及优化:逻辑回归的损失,称为对数似然损失。(损失函数值越小越好) 整体完整函数: 优化:提高原本属于1类别的概率,降低原本是0类别的概率。
逻辑回归api的介绍
逻辑回归通过sklearn.linear_model.LogisticRegression
类实现。首先需要从sklearn库中导入这个类:
from sklearn.linear_model import LogisticRegression |
主要参数
LogisticRegression
类有多个参数,以下是一些主要参数及其说明:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
penalty | str | 'l2' | 正则化项的类别,可选'l1'或'l2'。'l1'表示L1正则化,'l2'表示L2正则化。 |
C | float | 1.0 | 正则化强度的倒数。值越小,正则化越强。 |
solver | str | 'liblinear' | 用于优化问题的算法。可选参数有'liblinear', 'sag', 'saga', 'newton-cg', 'lbfgs'。不同的solver适用于不同的数据集大小和类型。 |
max_iter | int | 100 | 算法收敛的最大迭代次数。仅对'newton-cg', 'sag', 'saga'和'lbfgs' solver有效。 |
multi_class | str | 'ovr' | 分类方式选择参数,可选'ovr'(one-vs-rest)或'multinomial'(many-vs-many)。对于二元逻辑回归,两者无区别。 |
class_weight | dict, 'balanced'或None | None | 各类别的权重。如果为'balanced',则算法会自动根据训练数据中的类别频率计算权重。 |
random_state | int, RandomState instance或None | None | 随机数种子。用于控制随机选择数据的可重复性。 |
fit_intercept | bool | True | 是否计算截距项。 |
tol | float | 1e-4 | 停止求解的标准,即求解到多少时停止,认为已经求出最优解。 |
方法
LogisticRegression
类的主要方法包括:
fit(X, y)
: 训练模型。X
是特征数据,y
是目标变量(标签)。predict(X)
: 使用训练好的模型对新的数据集X
进行预测,返回预测结果。predict_proba(X)
: 返回预测属于各个类别的概率。score(X, y)
: 返回模型在测试集上的准确率。
示例
以下是一个使用LogisticRegression
进行二分类问题的简单示例:
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split # 加载iris数据集 iris = load_iris() x = iris.data y = iris.target # 只使用两个类别进行二分类 x = x[y != 2] y = y[y != 2] # 划分训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) # 创建逻辑回归模型 model = LogisticRegression(solver='liblinear', random_state=42) # 训练模型 model.fit(x_train, y_train) # 预测测试集 y_pred = model.predict(x_test) # 评估模型 accuracy = model.score(x_test, y_test) print(f"准确性: {accuracy}")
案例:
癌症分类预测:
import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 定义列名 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()) # 2.1 缺失值处理 data = data.replace(to_replace="?", value=np.NaN) data = data.dropna() # 2.2 确定特征值和目标值 x = data.iloc[:, 1:10] y = data["Class"] # 查看特征值和目标值的头部 print(x.head()) print(y.head()) # 2.3 分割数据 x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22) # 3. 特征工程(标准化) transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4. 机器学习(逻辑回归) estimator = LogisticRegression() estimator.fit(x_train, y_train) # 5. 模型评估 y_predict = estimator.predict(x_test) print("预测结果:", y_predict) print("模型准确率:", estimator.score(x_test, y_test))
分类评估方法
混淆矩阵:混淆矩阵是一种特别直观的评估分类模型性能的工具,它清晰地展示了模型预测结果与实际类别之间的关系。
以下是几种常用的逻辑回归分类评估指标:
-
准确率:
准确率是预测正确的样本数占总样本数的比例。它是最直观的评估指标,但在类别不平衡的情况下可能不太可靠。公式:准确率 = (TP + TN) / (TP + TN + FP + FN)
-
精确率:
精确率表示预测为正样本的样本中,实际为正样本的比例。公式:精确率 = TP / (TP + FP)
-
召回率:
召回率表示实际为正样本的样本中,被预测为正样本的比例。公式:召回率 = TP / (TP + FN)
-
F1 Score:
F1 分数是精确率和召回率的调和平均数,用于平衡精确率和召回率。公式:F1 分数 = 2 * (精确率 * 召回率) / (精确率 + 召回率)
分类评估报告api
sklearn.metrics.classification_report
是Python中Scikit-learn库提供的一个非常常用的API,用于显示主要分类指标的文本报告。
使用示例代码:
from sklearn.metrics import classification_report | |
# y_true 是真实标签 | |
# y_pred 是模型预测的标签 | |
report = classification_report(y_true, y_pred, labels=[], target_names=None) | |
print(report) |
- 参数说明:
y_true
:真实目标值,即样本的真实类别标签。y_pred
:估计器预测目标值,即模型预测的类别标签。labels
:一个可选参数,用于指定要包含的标签集,并改变报告中的类别顺序。如果为空,则报告中将包含所有在y_true
或y_pred
中出现的标签。target_names
:一个可选参数,用于显示标签的自定义名称,而非它们的数字标识。
- 返回值:
该函数返回一个字符串,包含了每个类别的精确率、召回率、F1分数以及支持度(即每个类别的样本数)。
ROC曲线与AUC指标
一、ROC曲线
定义:
ROC曲线,是一种用于表示分类模型性能的图形工具。它通过在不同阈值下绘制真阳性率(TPR)和假阳性率(FPR)的关系来展示模型的性能。
关键指标:
- 真阳性率(TPR):TPR = TP / (TP + FN)。TPR越接近1,表示模型对正例的识别能力越强。
- 假阳性率(FPR):FPR = FP / (FP + TN)。FPR越接近0,表示模型对负例的误判率越低。
ROC曲线的意义:
ROC曲线越靠近左上角,模型的性能越好。左上角的点表示TPR接近1且FPR接近0,即模型能够准确地识别出所有的正例且误判的负例很少。ROC曲线下的面积即为AUC值,AUC值越大,表示模型的性能越好。
二、AUC指标
定义:
AUC是指ROC曲线下的面积,用于量化评估分类器的性能。AUC值的取值范围通常在0.5到1之间,值越大表示模型性能越好。
AUC值的意义:
- AUC = 1:表示模型是完美的,即存在至少一个阈值能得出完美预测。但在实际应用中,这种情况很少见。
- 0.5 < AUC < 1:表示模型优于随机猜测,通过设置合适的阈值,模型具有一定的预测价值。
- AUC = 0.5:表示模型性能与随机猜测相当,没有预测价值。
- AUC < 0.5:虽然理论上AUC值可以小于0.5,但在实际应用中,如果模型的表现真的这么差,通常可以通过反转预测结果(即将预测为正例的样本视为负例,反之亦然)来改进模型性能,使其AUC值大于0.5。
AUC值的计算:
sklearn.metrics.roc_auc_score
roc_auc_score
函数用于计算ROC曲线下的面积,即AUC值。
示例:
from sklearn.metrics import roc_auc_score | |
# y_true: 真实标签,必须是0或1 | |
# y_score: 预测得分,可以是正类的估计概率、置信值或者分类器方法的返回值 | |
auc = roc_auc_score(y_true, y_score) |
- y_true:数组、列表或类似数组的数据结构,表示每个样本的真实类别标签,必须为0(负例)或1(正例)。
- y_score:与y_true形状相同的数组、列表或类似数组的数据结构,表示每个样本属于正类的预测得分。
ROC曲线的绘制
- AUC值是ROC曲线下与坐标轴围成的面积,AUC值越大,分类器的性能越好。
补充:
分类中解决类别不平衡问题
过采样
过采样技术通过增加少数类样本来平衡数据集。这可以通过以下方式实现:
1. 随机过采样: 从少数类样本中随机抽取样本并进行复制,然后将这些复制后的样本添加到数据集中,以增加少数类样本的数量。
from sklearn.datasets import make_classification import matplotlib.pyplot as plt from collections import Counter # 创建数据集 X,y= make_classification(n_samples=5000, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_classes=3, n_clusters_per_class=1, weights=[0.01, 0.05, 0.94], random_state=0) Counter(y) plt.scatter(X[:, 0], X[:, 1], c=y) plt.show() #使用imblearn进行随机过采样 from imblearn.over_sampling import RandomOverSampler ros =RandomOverSampler(random_state=0) X_resampled,y_resampled = ros.fit_resample(X, y)#查看结果 Counter(y_resampled) #数据集可视化 plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled) plt.show()
2. SMOTE过采样:对少数类样本进行分析,并根据这些样本人工合成新的样本添加到数据集中,以增加少数类样本的数量,从而达到数据平衡的目的。
from imblearn.over_sampling import SMOTE X_resampled, y_resampled -SMOTE( ).fit_resample(X, y) Counter(y_resampled) Counter({2: 4674,1:4674,0:4674}) # 数据可视化 plt.scatter(X_resampled[:,0], X_resampled[:, 1], c=y_resampled) plt.show()
欠采样
欠采样技术通过减少多数类样本来平衡数据集。这可以通过以下方式实现:
-
随机欠采样:随机地从多数类样本中选取一部分样本,以减少其数量。这种方法简单快捷,但可能会丢失多数类中的重要信息,导致模型在预测多数类时的性能下降。
#随机欠采样 from imblearn. under_sampling import RandomUnderSampler rus = RandomUnderSampler(random_state=0) x_resampled, y_resampled = rus.fit_resample(X,y) Counter(y_resampled) # 数据集可视化 plt.scatter(X_resampled[:, 0], X_resampled[:,1], c=y_resampled) plt.show( )
问题:Python 版本不兼容
解决方法:
python --version查看python版本
然后查看版本对应的imblearn版本
或者pip install -U imbalanced-learn更新库
或者重新安装pip uninstall imbalanced-learn
pip install imbalanced-learn
(其实只要python版本在3.8及以上一般不会有不兼容情况
如果python版本太低升版本或再创建一个环境)
升版本:conda update python