关于使用逻辑回归时为了提高召回尝试过的方法

总的来说,导致该问题出现的原因有以下几个

  • 数据不平衡:如果训练数据中两个类别的样本数量不平衡,例如一个类别的样本数量比另一个类别少很多,那么模型可能会倾向于预测数量较多的类别。可以通过一些方法来解决数据不平衡问题,例如欠采样、过采样或者生成合成样本等方式。

  • 特征选择:选择具有良好区分能力的特征对于提高模型性能至关重要。可以使用一些特征选择技术,例如方差阈值、相关性阈值、递归特征消除等方法,来选择最佳特征集合。

  • 正则化参数:正则化参数可以控制模型的复杂度,从而避免过拟合。可以通过交叉验证等方法来确定最佳的正则化参数。

  • 阈值调整:逻辑回归模型预测的结果是概率值,可以将预测的概率值与一个阈值进行比较,从而决定最终的分类。可以通过调整阈值来平衡召回率和准确率的权衡。

一.数据均衡问题

首先,数据均衡问题,我们在设置训练正负样本时基本保证的比例为1:1,因此可以排除不平衡问题

二.尝试阈值调整(有效)

然后尝试阈值调整,由于我们基本上只关注召回率,默认阈值0.5时,类别1的召回率94%,类别0的召回率54%,但是这个结果看起来不太好,领导希望是类别1召回不低于90%,类别0在60%左右,于是我们设置阈值为0.6,此时类别1的召回率90%,类别0的召回率58%

以下是设置阈值的方式

import numpy as np
from sklearn.linear_model import LogisticRegression

# 假设X为样本特征,y为样本标签
X = ...
y = ...

# 构建逻辑回归模型
lr = LogisticRegression()

# 训练模型
lr.fit(X, y)

# 预测概率值
y_prob = lr.predict_proba(X)[:, 1]

# 设定阈值为0.7,当概率值大于0.7时,将样本分类为正例,否则分类为负例
y_pred = np.where(y_prob > 0.7, 1, 0)

三.尝试设置相关性阈值(无效)

相关性阈值介绍:本质是降维

相关性阈值是指在特征选择过程中,用于筛选特征的一个阈值。通常情况下,我们会使用皮尔逊相关系数、Spearman秩相关系数等方法来计算特征之间的相关性,然后将相关性系数大于某个阈值的特征删除或保留。

关于如何设置相关性阈值,一般没有一个统一的标准。具体来说,需要根据实际问题和数据集的情况进行调整。在实际操作中,我们可以考虑以下几个方面:

  1. 相关性系数的大小:相关性系数的取值范围为[-1, 1],绝对值越大,表示两个特征之间的相关性越强。通常情况下,相关性系数的绝对值大于0.5或0.6时,可以认为两个特征之间存在较强的相关性。

  2. 特征数量和样本数量的比例:特征数量和样本数量的比例对于相关性阈值的设置也有一定的影响。当特征数量很大而样本数量很小时,相关性系数的估计可能会不准确,此时可以适当调高相关性阈值,降低误判率。当特征数量较少而样本数量很大时,可以适当降低相关性阈值,保留更多的特征信息。

  3. 特征的相关性结构:在特征选择过程中,特征之间的相关性结构也需要考虑。如果某些特征之间存在高度相关性,但是都与目标变量存在一定的相关性,此时可以将其中的一个特征删除,保留另一个特征。

总之,在设置相关性阈值时,需要综合考虑多个因素,根据实际问题和数据集的情况进行调整。通常情况下,我们可以先尝试不同的相关性阈值,比较不同阈值下的模型性能和特征选择结果,然后选择一个最优的阈值。

以下是使用相关性阈值进行特征选择的示例代码,其中使用了numpy和pandas库进行数据处理,sklearn库中的SelectKBest和chi2方法进行特征选择。

假设我们有一个二分类的数据集,其中包含10个特征和1个目标变量。我们的目标是使用相关性阈值筛选出和目标变量最相关的K个特征,并用这些特征进行建模。

import numpy as np
import pandas as pd
from sklearn.feature_selection import SelectKBest, chi2

# 加载数据集
data = pd.read_csv('data.csv')

# 将特征和目标变量分离
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

# 计算特征之间的相关系数矩阵
corr_matrix = X.corr()

# 设置相关性阈值
corr_threshold = 0.5

# 根据相关性阈值筛选特征
selected_features = []
for i in range(len(corr_matrix.columns)):
    for j in range(i):
        if abs(corr_matrix.iloc[i, j]) >= corr_threshold:
            colname = corr_matrix.columns[i]
            if colname not in selected_features:
                selected_features.append(colname)

# 选择K个和目标变量最相关的特征
K = 5
selector = SelectKBest(score_func=chi2, k=K)
selector.fit(X[selected_features], y)
selected_features = X[selected_features].columns[selector.get_support()]

# 输出筛选后的特征
print(selected_features)

在上述代码中,我们首先使用pandas库将数据集中的特征和目标变量分离。然后,通过计算相关系数矩阵,筛选出和阈值相关性系数大于等于0.5的特征。最后,使用SelectKBest方法和卡方检验选择和目标变量最相关的5个特征,输出筛选后的特征名称

四.递归特征消除(无效)

本质是降维

简介:

递归特征消除(Recursive Feature Elimination,RFE)是一种通过递归删除特征的方法进行特征选择的技术。它通过训练模型并反复剔除最不重要的特征,直到达到指定的特征数量或者性能评估标准,从而实现对特征的筛选。

下面是使用sklearn库中的RFE方法进行递归特征消除的示例代码。假设我们有一个二分类的数据集,其中包含10个特征和1个目标变量。我们的目标是使用RFE方法筛选出最重要的K个特征,并用这些特征进行建模。

import numpy as np
import pandas as pd
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# 加载数据集
data = pd.read_csv('data.csv')

# 将特征和目标变量分离
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

# 定义逻辑回归模型
lr_model = LogisticRegression()

# 定义RFE方法
K = 5
rfe_selector = RFE(estimator=lr_model, n_features_to_select=K)

# 对数据集进行特征选择
X_selected = rfe_selector.fit_transform(X, y)

# 输出筛选后的特征
print(X.columns[rfe_selector.support_])

在上述代码中,我们首先使用pandas库将数据集中的特征和目标变量分离。然后,定义一个逻辑回归模型和RFE方法,并将目标特征数量设置为5。最后,对数据集进行特征选择,并输出筛选后的特征名称。

在这里,我们使用RFE的fit_transform方法对数据集进行特征选择,并将结果存储在一个新的数据框中(X_selected)。同时,使用rfe_selector的support_属性输出筛选后的特征名称。注意,rfe_selector.support_是一个布尔类型的数组,表示每个特征是否被选择。

五.通过交叉验证方法确定最优的正则化参数(无效)

通过交叉验证(Cross Validation)方法可以帮助我们确定模型的最优正则化参数。交叉验证方法可以在训练集上划分出多个不同的子集,然后使用每个子集进行模型训练和评估,从而评估模型在不同数据集上的性能。

在sklearn的LogisticRegression类中,C是控制正则化强度的超参数,表示正则化项的系数,与正则化方式(L1或L2)一起确定正则化的强度。C的值越小,表示越强的正则化,C的值越大,表示越弱的正则化。

对于L2正则化的Logistic Regression模型,C的默认值为1.0。如果需要对正则化的强度进行更细粒度的控制,可以通过设置C的值来调整,通常情况下,需要使用交叉验证等方法来搜索最佳的C值。

需要注意的是,C的值越小,表示越强的正则化,可能导致模型过于简单,无法捕捉数据中的关键特征,从而出现欠拟合现象;而C的值越大,表示越弱的正则化,可能导致模型过于复杂,出现过拟合现象。因此,需要在训练模型时进行适当的正则化,以获得更好的泛化能力。

在以下示例代码中,我们使用交叉验证方法确定Logistic Regression模型的最优正则化参数C。我们将数据集分成5个子集,使用其中4个子集进行训练,另一个子集进行验证。我们在不同的C值(10的负指数幂)下训练模型,然后计算每个C值下的平均验证集得分。最后,我们选择平均验证集得分最高的C值作为最优参数。

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score, KFold

# 定义逻辑回归模型
lr_model = LogisticRegression()

# 定义正则化参数C的候选值
Cs = [10**(-i) for i in range(5)]

# 使用交叉验证选择最优参数
cv_scores = []
kf = KFold(n_splits=5)
for C in Cs:
    lr_model.set_params(C=C)
    scores = cross_val_score(lr_model, X_train, y_train, cv=kf, scoring='accuracy')
    cv_scores.append(np.mean(scores))

# 输出最优参数
best_C = Cs[np.argmax(cv_scores)]
print('Best C:', best_C)

在上述代码中,我们首先定义逻辑回归模型和正则化参数C的候选值。然后,使用交叉验证方法选择最优参数。在每次循环中,我们使用逻辑回归模型和当前的C值进行训练,并在训练集上计算交叉验证得分。最后,将每个C值下的平均交叉验证得分存储在一个列表中(cv_scores)。

在所有C值的交叉验证得分计算完成后,我们选择平均交叉验证得分最高的C值作为最优参数,并将其输出

在sklearn的cross_val_score函数中,scoring参数用于指定评价指标。scoring参数可以指定多种不同的评价指标,常用的评价指标如下:

  • 分类问题:
    • accuracy:准确率。
    • precision:精确率。
    • recall:召回率。
    • f1:F1-score。
    • roc_auc:ROC曲线下的面积(仅适用于二分类问题)。
  • 回归问题:
    • r2:决定系数(Coefficient of determination)。
    • neg_mean_absolute_error:平均绝对误差(Mean absolute error)的负数。
    • neg_mean_squared_error:均方误差(Mean squared error)的负数。

在scikit-learn中,每个评价指标都有一个默认的可选值,但也可以通过自定义评价指标来进行更灵活的设置。例如,可以使用make_scorer函数来创建自定义评价指标,并将其传递给cross_val_score的scoring参数进行使用。

六.增加多项式特征(无效)

本质:增加模型复杂度

可以使用PolynomialFeatures类来增加多项式特征,该类可以生成给定次数的多项式特征集合。

下面是一个示例代码,假设我们的特征集合为X,需要增加二次多项式特征,代码如下:

from sklearn.preprocessing import PolynomialFeatures

# 生成2次多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

在这里,我们将degree设置为2,即生成二次多项式特征。include_bias参数控制是否生成包含常数项的多项式特征,默认为True。

最后,fit_transform函数将生成的多项式特征集合应用到原始特征集合X上,生成新的特征集合X_poly。该方式会导致生成的数据维度特别大

posted @ 2023-03-10 17:17  海_纳百川  阅读(227)  评论(0编辑  收藏  举报
本站总访问量