|
@@ -4,12 +4,15 @@
|
|
|
@time: 2024/11/1
|
|
|
@desc:
|
|
|
"""
|
|
|
+from typing import Dict
|
|
|
|
|
|
import pandas as pd
|
|
|
+import scorecardpy as sc
|
|
|
+from matplotlib import pyplot as plt
|
|
|
from sklearn.linear_model import LogisticRegression
|
|
|
-from toad.metrics import KS, AUC
|
|
|
|
|
|
-from entitys import MetricTrainEntity, TrainConfigEntity, DataPreparedEntity
|
|
|
+from entitys import TrainConfigEntity, DataPreparedEntity, MetricFucEntity
|
|
|
+from init import f_get_save_path
|
|
|
from .model_base import ModelBase
|
|
|
|
|
|
|
|
@@ -18,20 +21,42 @@ class ModelLr(ModelBase):
|
|
|
super().__init__(train_config)
|
|
|
self.lr = LogisticRegression(penalty='l1', C=0.9, solver='saga', n_jobs=-1)
|
|
|
|
|
|
- def train(self, data: DataPreparedEntity, *args, **kwargs) -> MetricTrainEntity:
|
|
|
+ def train(self, data: DataPreparedEntity, *args, **kwargs) -> Dict[str, MetricFucEntity]:
|
|
|
train_data = data.train_data
|
|
|
+ train_y = train_data.get_Ydata()
|
|
|
test_data = data.test_data
|
|
|
- self.lr.fit(train_data.get_Xdata(), train_data.get_Ydata())
|
|
|
+ test_y = test_data.get_Ydata()
|
|
|
+ self.lr.fit(train_data.get_Xdata(), train_y)
|
|
|
|
|
|
train_prob = self.lr.predict_proba(train_data.get_Xdata())[:, 1]
|
|
|
- train_auc = AUC(train_prob, train_data.get_Ydata())
|
|
|
- train_ks = KS(train_prob, train_data.get_Ydata())
|
|
|
-
|
|
|
test_prob = self.lr.predict_proba(test_data.get_Xdata())[:, 1]
|
|
|
- test_auc = AUC(test_prob, test_data.get_Ydata())
|
|
|
- test_ks = KS(test_prob, test_data.get_Ydata())
|
|
|
|
|
|
- return MetricTrainEntity(train_auc, train_ks, test_auc, test_ks)
|
|
|
+ image_path_list = []
|
|
|
+ train_perf = sc.perf_eva(train_y, train_prob, title="train", show_plot=True)
|
|
|
+ path = f_get_save_path(f"train_perf.png")
|
|
|
+ train_perf["pic"].savefig(path)
|
|
|
+ image_path_list.append(path)
|
|
|
+
|
|
|
+ test_perf = sc.perf_eva(test_y, test_prob, title="test", show_plot=True)
|
|
|
+ path = f_get_save_path(f"test_perf.png")
|
|
|
+ test_perf["pic"].savefig(path)
|
|
|
+ image_path_list.append(path)
|
|
|
+
|
|
|
+ train_auc = train_perf["KS"]
|
|
|
+ train_ks = train_perf["AUC"]
|
|
|
+
|
|
|
+ test_auc = test_perf["KS"]
|
|
|
+ test_ks = test_perf["AUC"]
|
|
|
+
|
|
|
+ metric_value_dict = {}
|
|
|
+ df = pd.DataFrame()
|
|
|
+ df["样本集"] = ["训练集", "测试集"]
|
|
|
+ df["AUC"] = [train_auc, test_auc]
|
|
|
+ df["KS"] = [train_ks, test_ks]
|
|
|
+
|
|
|
+ metric_value_dict["模型结果"] = MetricFucEntity(table=df, image_path=image_path_list, image_size=5)
|
|
|
+
|
|
|
+ return metric_value_dict
|
|
|
|
|
|
def predict_prob(self, x: pd.DataFrame, *args, **kwargs):
|
|
|
return self.lr.predict_proba(x)[:, 1]
|