scorecardpy的模型改写问题

我用了scorecardpy包来做一个评分卡模型,现在问题是,我想将它自带的逻辑回归预测模型替换为我自己的autogluon模型,但是报错了,代码是这样的

import pandas as pd
import numpy as np
import scorecardpy as sc


dat=pd.read_csv("dat.csv",index_col=0)
dat

dt_s = sc.var_filter(dat, y="isDefault")

dt_s.info()

train, test = sc.split_df(dt_s,'isDefault',ratio=0.8).values()
bins = sc.woebin(dt_s, y='isDefault',method="chimerge")
sc.woebin_plot(bins)
train_woe = sc.woebin_ply(train, bins)
test_woe = sc.woebin_ply(test, bins)
y_train = train_woe.loc[:,'isDefault']
X_train = train_woe.loc[:,train_woe.columns != 'isDefault']
y_test = test_woe.loc[:,'isDefault']
X_test = test_woe.loc[:,train_woe.columns != 'isDefault']
mport autogluon
from autogluon.tabular import TabularDataset,TabularPredictor  
import pandas as pd
import numpy as np
label='isDefault'
train_data=TabularDataset(train_woe )
metric = 'roc_auc'
time_limit=60
predictor=TabularPredictor(label=label,eval_metric=metric).fit(train_data,presets='best_quality',time_limit=time_limit,auto_stack=True)
test_data=TabularDataset(test_woe)
predictor.predict_proba(train_data)
train_proba=predictor.predict_proba(train_data)
train_proba=train_proba.values[:,1]
train_proba = np.array(train_proba).flatten() 
train_proba
predictor.predict_proba(test_data)
auto_proba=predictor.predict_proba(test_data)
auto_proba=auto_proba.values[:,1]
auto_proba = np.array(auto_proba).flatten() 
auto_proba
import toad
from toad.metrics import KS, AUC



print('Training error')
print('KS:', KS(train_proba,y_train))
print('AUC:', AUC(train_proba,y_train))




print('\nTest error')
print('KS:', KS(auto_proba,y_test))
print('AUC:', AUC(auto_proba,y_test))

card = sc.scorecard(bins,predictor, X_train.columns)

问题出在这个最后一句,我将我的模型predictor替换了scorecard包自带的lr,就显示报错
'TabularPredictor' object has no attribute 'coef_'
这个怎么解决?
谢谢各位了

目前来看难度较大,socrecardpy只能应用线性模型,你可以试试xgb回归与sgd回归,必须带有.coef_指令的模型

参考GPT和自己的思路,根据您提供的错误提示,'TabularPredictor'对象没有'coef_'属性,这可能是由于scorecardpy库期望使用的逻辑回归模型具有'coef_'属性,而autogluon训练的模型可能没有该属性。
您可以尝试将scorecardpy的代码进行自定义修改,以便使用autogluon训练的模型进行评分卡建模。具体来说,您需要重写scorecardpy中的“scorecard”函数,以将自己的模型替换为scorecardpy的默认逻辑回归模型。以下是一个修改的示例:

def my_scorecard(bins, model, features):
    card = {}
    for var in features:
        tmp = bins[var]['bin']
        score = bins[var]['woe']
        if model.problem_type == 'binary':
            coef = model.coef_[0][features.index(var)]
        elif model.problem_type == 'multiclass':
            coef = model.coef_[model.classes_.tolist().index(1)][features.index(var)]
        else:
            raise ValueError("Invalid problem type")
        card[var] = {'breaks': tmp, 'scores': score, 'coef': coef}
    return card


在这个自定义的“scorecard”函数中,我们接受一个autogluon模型“model”作为参数,并从该模型中提取特定变量的系数。然后将该系数添加到输出字典中,与每个变量的WOE和分箱一起返回。

然后,在您的代码中,您可以使用以下代码来生成评分卡:

card = my_scorecard(bins, predictor, X_train.columns)


这应该能够使用您自己的模型构建评分卡。请注意,如果您的模型与scorecardpy默认的逻辑回归模型具有不同的预测结果格式,则可能需要进一步自定义“my_scorecard”函数以匹配您的模型。

该回答引用ChatGPT

这个错误是由于 scorecardpy 中的 scorecard 函数期望使用逻辑回归模型,因为它需要 coef_ 属性来计算评分卡模型中的变量得分。

你可以考虑使用 autogluon 返回的模型的 feature_importance 属性来替代变量得分。或者,你可以考虑使用其他支持 coef_ 属性的模型(如逻辑回归模型)作为 scorecard 函数的输入。

以下是两种可能的解决方案:

1、使用 feature_importance 属性
你可以使用 TabularPredictor 中的 feature_importance 属性来获得每个特征的重要性得分,并将其用作评分卡模型中的变量得分。以下是一些示例代码:


# Fit autogluon model and get feature importance
predictor = TabularPredictor(label=label, eval_metric=metric).fit(train_data, presets='best_quality', time_limit=time_limit, auto_stack=True)
feat_importance = predictor.feature_importance(train_data)

# Convert feature importance to variable scores
var_scores = {}
for var, score in feat_importance.items():
    var_bins = bins[var]
    var_scores[var] = pd.Series(score).apply(lambda x: np.interp(x, [0, 1], var_bins['woe'])).values

# Create scorecard using variable scores
card = sc.Scorecard(bins, var_scores)

请注意,这种方法假设特征的重要性得分可以直接映射到变量得分。如果这不是完全准确的,那么评分卡模型可能会失去一些准确性。

1、使用支持 coef_ 属性的模型
你可以考虑使用支持 coef_ 属性的模型来替换 autogluon 模型。例如,你可以使用 sklearn 中的逻辑回归模型。以下是一些示例代码:


# Fit sklearn logistic regression model
from sklearn.linear_model import LogisticRegression
model = LogisticRegression().fit(X_train, y_train)

# Create scorecard using model coefficients
card = sc.Scorecard(bins, model.coef_)

请注意,这种方法需要你自己训练模型,并确保模型与数据兼容。你还需要考虑处理类别型变量、缺失值等数据清洗问题。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据报错信息,模型中缺少coef_属性,因为scorecardpy中使用的是sklearn.linear_model.LogisticRegression模型。而autogluon中的模型可能没有这个属性。因此,需要将scorecardpy中的逻辑回归模型替换为一个autogluon中有coef_属性的模型,例如autogluon.tabular.models.CatBoostModel

下面是修改后的代码:

import pandas as pd
import numpy as np
import scorecardpy as sc
from autogluon.tabular.models import CatBoostModel
from autogluon.tabular import TabularDataset, TabularPredictor
from sklearn.metrics import roc_auc_score

dat = pd.read_csv("dat.csv", index_col=0)
dat

dt_s = sc.var_filter(dat, y="isDefault")

dt_s.info()

train, test = sc.split_df(dt_s, 'isDefault', ratio=0.8).values()
bins = sc.woebin(dt_s, y='isDefault', method="chimerge")
sc.woebin_plot(bins)
train_woe = sc.woebin_ply(train, bins)
test_woe = sc.woebin_ply(test, bins)
y_train = train_woe.loc[:, 'isDefault']
X_train = train_woe.loc[:, train_woe.columns != 'isDefault']
y_test = test_woe.loc[:, 'isDefault']
X_test = test_woe.loc[:, train_woe.columns != 'isDefault']

# 训练autogluon模型
train_data = TabularDataset(train_woe)
metric = 'roc_auc'
time_limit = 60
predictor = TabularPredictor(label=label, eval_metric=metric).fit(train_data, presets='best_quality', time_limit=time_limit, auto_stack=True)
test_data = TabularDataset(test_woe)
predictor.predict_proba(train_data)
train_proba = predictor.predict_proba(train_data).iloc[:, 1].values
auto_proba = predictor.predict_proba(test_data).iloc[:, 1].values

# 计算KS和AUC
print('Training error')
print('KS:', KS(train_proba, y_train))
print('AUC:', AUC(train_proba, y_train))

print('\nTest error')
print('KS:', KS(auto_proba, y_test))
print('AUC:', AUC(auto_proba, y_test))

# 定义替换的模型
model = CatBoostModel()

# 训练替换模型
model.fit(X_train, y_train)
train_proba = model.predict_proba(X_train)[:, 1]
auto_proba = model.predict_proba(X_test)[:, 1]

print('Training error')
print('KS:', KS(train_proba, y_train))
print('AUC:', AUC(train_proba, y_train))

print('\nTest error')
print('KS:', KS(auto_proba, y_test))
print('AUC:', AUC(auto_proba, y_test))

card = sc.scorecard(bins, model, X_train.columns)

其中,我们使用CatBoostModel替换了scorecardpy中的逻辑回归模型,并使用fit方法进行训练。最后,可以使用修改后的模型训练scorecardpy中的评分卡模型。
如果我的回答解决了您的问题,请采纳!

根据错误提示 'TabularPredictor' object has no attribute 'coef_',可以发现在 scorecardpy 库的 scorecard 函数中使用了逻辑回归模型的属性 coef_,而 autogluon 中的 TabularPredictor 类并没有该属性,因此会报错。

你可以尝试使用其他模型替换逻辑回归模型,这里提供两种思路:

1.使用 autogluon 提供的逻辑回归模型
autogluon 中提供了逻辑回归模型的接口,可以使用以下代码进行训练:
predictor = TabularPredictor(label=label, eval_metric=metric).fit(train_data, presets='best_quality', time_limit=time_limit, auto_stack=True)
model = predictor._trainer.load_model(predictor._trainer.get_model_best())



然后使用 model 替代原来的 predictor,如下所示:
card = sc.scorecard(bins, model, X_train.columns)



2.将 autogluon 训练得到的模型转换为 sklearn 的模型
另一种思路是将 autogluon 训练得到的模型转换为 sklearn 模型,这样就可以使用该模型的 coef_ 属性。可以使用以下代码将 autogluon 模型转换为 sklearn 模型:
from autogluon.utils.tabular.ml.models.lr.lr_sklearn import LRSklearnModel

model = predictor._trainer.load_model(predictor._trainer.get_model_best())
sklearn_model = LRSklearnModel(model, feature_transformer=predictor.feature_transformer, problem_type='binary')
sklearn_model.fit(train_data)



然后使用 sklearn_model 替代原来的 predictor,如下所示:
card = sc.scorecard(bins, sklearn_model, X_train.columns)



注意:这里要求 autogluon 版本为 0.1.0 或以上,否则可能会出现兼容性问题。