使用逻辑回归预测,通过ROC曲线寻找最佳阈值,为什么有时候比默认的0.5阈值预测的准确率和召回率低呢?
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import standardScaler
from sklearn.linear_model import LogisticRegression
#1.获取数据
data = pd.read_csv("data")
data.head()
#2.数据处理
#2.1缺失值处理
data = data.replace(to_replace="?",value=np.nan)
data = data.dropna()
#2.2确定特征值,目标值
data.head()
x = data.iloc[:,1:-1]
x.head()
y = data['Class']
y.head()
#2.3分割数据
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22,test_size=0.2)
#3,特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
#4,逻辑回归
estimator = LogisticRegression()
estimator.fit(x_train,y_train)
#5,模型评估
#5.1准确率
ret = estimator.score(x_test,y_test)
print('准确率:\n',ret)
#5.2预测值
y_pre = estimator.predict(x_test)
print('预测值:\n',y_pre)
对于逻辑回归模型在寻找最佳阈值后准确率下降的问题,主要原因在于模型本身或数据的质量。
从模型本身来看,如果模型过于复杂,容易在训练集上过拟合但泛化能力差,这样在测试集上表现就不理想,准确率会下降。
解决办法是适当简化模型,如增加正则化项或缩减特征数量。从数据质量来看,如果训练集和测试集分布不同,那么在训练集上找到的最佳阈值不代表在测试集上的最佳值,这会导致测试集准确率降低。
这需要我们重新考虑训练集和测试集的划分,尽量使两者分布趋于一致。另外,如果训练集样本量过小,通过ROC曲线找到的最佳阈值可靠性差,在测试集上表现不佳也在所难免。这需要我们积累更多的高质量样本以获得更可靠的最佳阈值。此外,如果训练集正负例比例严重失衡,最佳阈值的选择也会偏向多数类,无法很好区分少数类样本,导致在测试集上少数类的识别准确率下降。我们需要采用采样手段以平衡正负例比例。
最后,如果训练集标签存在较大噪声,这也会影响最佳阈值的选择,使得在测试集上的准确率下 slide。这需要我们根据实际情况清理或校正训练集的标签。总之,逻辑回归模型在选择最佳阈值后准确率下降的主要原因在模型本身和数据质量方面。我们应从这两个角度对具体问题进行分析,并采取针对性的改进措施解决准确率下降的问题。