人工智能金融分析
1.应用场景
- 客户流失预测
- 风险预测/信用违约预测
- 银行客户认购产品预测
2.风险预测/信用违约预测
项目地址:https://aistudio.baidu.com/aistudio/projectdetail/6448172?forkThirdPart=1
2.2 code
2.2.1 数据预处理
- 数据读取
import pandas as pd
import numpy as np
df=pd.read_csv("data/data207852/train.csv")
test=pd.read_csv("data/data207852/test.csv")
test.head(10)
test.info()
df.head(10)
df.info()
- NaN处理
df['Credit_Product'].unique()
df['Credit_Product'].value_counts()
df=df.fillna('No')
test=test.fillna('No')
2.2.2 数据EDA
- duration分箱展示
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 按年龄分布查看
ages=[22,30,40,50,60,70,80,90]
df1=df[df['Credit_Product']=='Yes']
binning=pd.cut(df1['Age'],ages,right=False)
time=pd.value_counts(binning)
# 可视化
time=time.sort_index()
fig=plt.figure(figsize=(6,2),dpi=120)
sns.barplot(time.index,time,color='royalblue')
x=np.arange(len(time))
y=time.values
for x_loc,jobs in zip(x,y):
plt.text(x_loc, jobs+2, '{:.1f}%'.format(jobs/sum(time)*100), ha='center', va= 'bottom',fontsize=8)
plt.xticks(fontsize=8)
plt.yticks([])
plt.ylabel('')
plt.title('duration_yes',size=8)
sns.despine(left=True)
plt.show()
- 查看数据分布
# 分离数值变量与分类变量
Nu_feature = list(df.select_dtypes(exclude=['object']).columns)
Ca_feature = list(df.select_dtypes(include=['object']).columns)
#查看训练集与测试集数值变量分布
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
plt.figure(figsize=(15,5))
Nu_feature.remove('Target')
# 根据数值型分布查看
i=1
for col in Nu_feature:
ax=plt.subplot(1,3,i)
ax=sns.kdeplot(df[col],color='red')
ax=sns.kdeplot(test[col],color='cyan')
ax.set_xlabel(col)
ax.set_ylabel('Frequency')
ax=ax.legend(['train','test'])
i+=1
plt.show()
- 数据相关图
# 离散数据Encoder
from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()
cols = Ca_feature
for m in cols:
df[m] = lb.fit_transform(df[m])
test[m] = lb.fit_transform(test[m])
correlation_matrix=df.corr()
plt.figure(figsize=(12,10))
# 热力图
sns.heatmap(correlation_matrix,vmax=0.9,linewidths=0.05,cmap="RdGy")
2.2.3 建立模型
- 切割训练集和测试集
这里使用留出法划分数据集,将数据集分为自变量和因变量。
按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%),使用分层抽样,设置随机种子以便结果能复现
from lightgbm.sklearn import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score, auc, roc_auc_score
X=df.drop(columns=['ID','Target'])
Y=df['Target']
test=test.drop(columns='ID')
# 划分训练及测试集
x_train,x_test,y_train,y_test = train_test_split( X, Y,test_size=0.3,random_state=1)
- 模型创建
创建基于树的分类模型(lightgbm)
这些模型进行训练,分别的到训练集和测试集的得分
# 建立模型
gbm = LGBMClassifier(n_estimators=600,learning_rate=0.01,boosting_type= 'gbdt',
objective = 'binary',
max_depth = -1,
random_state=2022,
metric='auc')
2.2.4 模型训练
交叉验证介绍
- 交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
- 在交叉验证中,数据被多次划分,并且需要训练多个模型。
- 最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。
- 模型训练
# 交叉验证
result1 = []
mean_score1 = 0
n_folds=5
kf = KFold(n_splits=n_folds ,shuffle=True,random_state=2022)
for train_index, test_index in kf.split(X):
x_train = X.iloc[train_index]
y_train = Y.iloc[train_index]
x_test = X.iloc[test_index]
y_test = Y.iloc[test_index]
gbm.fit(x_train,y_train)
y_pred1=gbm.predict_proba((x_test),num_iteration=gbm.best_iteration_)[:,1]
print('验证集AUC:{}'.format(roc_auc_score(y_test,y_pred1)))
mean_score1 += roc_auc_score(y_test,y_pred1)/ n_folds
y_pred_final1 = gbm.predict_proba((test),num_iteration=gbm.best_iteration_)[:,1]
y_pred_test1=y_pred_final1
result1.append(y_pred_test1)
- 模型评估
# 模型评估
print('mean 验证集auc:{}'.format(mean_score1))
cat_pre1=sum(result1)/n_folds
- 输出结果
将预测结果按照指定格式输出到result.csv文件中
ret1=pd.DataFrame(cat_pre1,columns=['Target'])
ret1['Target']=np.where(ret1['Target']>0.5,'1','0').astype('str')
result = pd.DataFrame()
test=pd.read_csv("data/data207852/test.csv")
result['ID'] = test['ID']
result['Target'] = ret1['Target']
result.to_csv('result.csv',index=False)
print(test.columns)