我用了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 或以上,否则可能会出现兼容性问题。