数据预处理
说明:这份数据集是金融数据(非原始数据,已经处理过了),我们要做的是预测贷款用户是否会逾期。表格中 “status” 是结果标签:0表示未逾期,1表示逾期。
import pandas as pd
from sklearn.model_selection import train_test_split
financial = pd.read_csv("data.csv", encoding = 'gbk')
financial.head()
financial.info()
financial["source"].value_counts()
financial["reg_preference_for_trad"].value_counts()
financial["bank_card_no"].value_counts()
financial["trade_no"].value_counts()
这一步发现source和bank_card_no这两个属性所有数据都是一样的,没有统计意义,所以drop一下
fi_copy = financial.copy()
for x in ("source", "bank_card_no", "trade_no", "id_name"):
fi_copy.drop([x], axis=1, inplace=True)
fi_copy.info()
类别型特征编码
fi_copy = fi_copy.drop("status", axis=1)
fi_copy_num = fi_copy.select_dtypes(include='number')
fi_copy_obj = fi_copy.select_dtypes(exclude='number')
y = financial["status"]
fi_obj = pd.DataFrame()
fi_obj["reg_preference_for_trad"] = fi_copy_obj["reg_preference_for_trad"].map({'境外':0,'一线城市':1, '二线城市':2, '三线城市':3})
fi_obj['latest_query_time_year'] = pd.to_datetime(fi_copy_obj['latest_query_time']).dt.year
fi_obj['latest_query_time_month'] = pd.to_datetime(fi_copy_obj['latest_query_time']).dt.month
fi_obj['latest_query_time_weekday'] = pd.to_datetime(fi_copy_obj['latest_query_time']).dt.weekday
fi_obj['loans_latest_time_year'] = pd.to_datetime(fi_copy_obj['loans_latest_time']).dt.year
fi_obj['loans_latest_time_month'] = pd.to_datetime(fi_copy_obj['loans_latest_time']).dt.month
fi_obj['loans_latest_time_weekday'] = pd.to_datetime(fi_copy_obj['loans_latest_time']).dt.weekday
fi_obj.head()
数值型特征缺失值填充:
from sklearn.preprocessing import Imputer
imputer = Imputer(strategy="most_frequent")
imputer.fit(fi_copy_num)
fi_num = imputer.transform(fi_copy_num)
fi_num = pd.DataFrame(fi_num,columns=fi_copy_num.columns)
特征组合并构建模型预测然后评估
fi_pro = pd.concat([fi_num, fi_obj], axis=1, sort=False)
import lightgbm as lgb
import xgboost as xgb
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.metrics import roc_auc_score
fi_std_train, fi_std_test, y_train, y_test = train_test_split(fi_pro, y, test_size=0.3, random_state=2019)
lgbc = lgb.LGBMClassifier()
lgbc.fit(fi_std_train,y_train)
xgbc = xgb.XGBClassifier()
xgbc.fit(fi_std_train,y_train)
def model_metrics(clf, X_test, y_test):
y_test_pred = clf.predict(X_test)
y_test_prob = clf.predict_proba(X_test)[:, 1]
accuracy = accuracy_score(y_test, y_test_pred)
print('The accuracy: ', accuracy)
precision = precision_score(y_test, y_test_pred)
print('The precision: ', precision)
recall = recall_score(y_test, y_test_pred)
print('The recall: ', recall)
f1_score = recall_score(y_test, y_test_pred)
print('The F1 score: ', f1_score)
model_metrics(xgbc,fi_std_test,y_test)
model_metrics(lgbc,fi_std_test,y_test)
The accuracy: 0.7911702873160477
The precision: 0.6649484536082474
The recall: 0.356353591160221
The F1 score: 0.356353591160221
The accuracy: 0.7701471618780659
The precision: 0.580952380952381
The recall: 0.3370165745856354
The F1 score: 0.3370165745856354