一 逻辑回归简介
1.1 定义
逻辑回归解决的是二分类问题
1.2 逻辑回归的输入和输出
输入:逻辑回归的输入就是一个线性回归的输出
输出:回归的结果输入到sigmoid函数当中,输出在[0, 1]区间中的一个概率值,默认为0.5为阈值
sigmoid激活函数:
若以0.5为阈值,则大于0.5的为一个类别,小于0.5的为另一个类别,再与真实值进行对比
1.3 损失函数
对数似然损失:
当y=1时,我们希望hθ(x)值越大越好
当y=0时,我们希望hθ(x)值越小越好
优化方案:
提升原本属于1类别的概率
降低原本是0类别的概率
二 逻辑回归API
sklearn.linear_model.LogisticRegression(solver=‘liblinear’, penalty=‘l2’, C = 1.0)
参数:
solver:用于优化问题的算法。包括{‘liblinear’, ‘sag’, ‘saga’,‘newton-cg’, ‘lbfgs’}
小数据集:“liblinear”,大数据集:“sag”和“saga”
多分类问题:,‘newton-cg’, ‘sag’, ‘saga’和’lbfgs’,“liblinear”仅限于“one-versus-rest”分类(二分类)
penalty:正则化的种类,L1和L2
C:正则化力度
from sklearn.linear_model import LogisticRegression
# 训练模型
estimator = LogisticRegression()
estimator.fit(x_train,y_train)
三 逻辑回归评估方法
混淆矩阵:
3.1 准确率
score = (TP+TN)/(TP+FN+FP+TN)
score = estimator.score(x_test,y_test)
3.2 精确率(Precision)
预测结果为正例样本中真实为正例的比例
精确率 = TP/(TP+FP)
3.3 召回率(Recall)
真实为正例的样本中预测结果为正例的比例
召回率(TPR) = TP/(TP+FN)
3.4 F1-score
反映了模型的稳健型
3.5 分类评估报告API
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
y_true:真实目标值
y_pred:估计器预测目标值
labels:目标值对应的数字
target_names:目标类别名称
return:每个类别精确率与召回率
from sklearn.metrics import classification_report
ret = classification_report(y_test, y_predict, labels=(2,4), target_names=("良性", "恶性"))
3.6 ROC曲线与AUC指标
样本不均衡:其中样本中类别比例大于4:1则认为样本不均衡
TPR(召回率) = TP / (TP + FN)
所有真实类别为1的样本中,预测类别为1的比例,预测对了
FPR = FP / (FP + TN)
所有真实类别为0的样本中,预测类别为1的比例,预测错了
(1)ROC曲线
ROC曲线的横轴就是FPR,纵轴就是TPR
(2)AUC指标
AUC的范围在[0, 1]之间
AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测
AUC=0,表示全部猜错
AUC= 0.5,胡乱猜测
0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值
(3)AUC指标的API
sklearn.metrics.roc_auc_score(y_true, y_score)
y_true:必须为0(反例),1(正例)标记
y_score:预测值
from sklearn.metrics import roc_auc_score
y_test = np.where(y_test > 2.5, 1, 0)
roc_auc_score(y_test, y_pre)
四 过采样和欠采样
过采样方法:增加数量较少那一类样本的数量,使得正负样本比例均衡。
欠采样方法:减少数量较多那一类样本的数量,使得正负样本比例均衡。
4.1 过采样
(1)随机过采样
随机过采样是在少数类中随机选择一些样本,然后通过复制所选择的样本生成样本集,将它们添加到少数类中来扩大原始数据集从而得到新的少数类集合
# 使用imblearn进行随机过采样
from imblearn.over_sampling import RandomOverSampler
from collections import Counter
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)
#查看结果
Counter(y_resampled)
# out
# Counter({2: 4674, 1: 4674, 0: 4674})
# 数据集可视化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
缺点:
容易造成模型的过拟合问题,因为随机过采样是简单的对初始样本进行复制采样,这就使得学习器学得的规则过于具体化,不利于学习器的泛化性能
(2)SMOTE算法
每个少数类样本 ,从它的k个最近邻中随机选择1个样本,然后在 两个样本之间的连线上随机选择一点作为新合成的少数类样本。
# SMOTE过采样
from imblearn.over_sampling import SMOTE
from collections import Counter
X_resampled, y_resampled = SMOTE().fit_resample(X, y)
Counter(y_resampled)
# out
# [(0, 4674), (1, 4674), (2, 4674)]
# 数据集可视化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
4.2 欠采样
(1)随机欠采样方法
很少使用,由于采样的样本集合要少于原来的样本集合,因此会造成一些信息缺失,即将多数类样本删除有可能会导致分类器丢失有关多数类的重要信息
# 随机欠采样
from imblearn.under_sampling import RandomUnderSampler
from collections import Counter
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X, y)
Counter(y_resampled)
# out
[(0, 64), (1, 64), (2, 64)]
# 数据集可视化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()
补充
- 查看每个目标值分类的样本量
#查看各个标签的样本量
from collections import Counter
Counter(iris.target)