#注入必要库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import time
from sklearn.svm import SVC #支持向量机分类器
from sklearn.neighbors import KNeighborsClassifier #K近邻分类器
from sklearn.linear_model import LogisticRegression #逻辑回归分类器
import xgboost as xgb #XGBoost分类器
import lightgbm as lgb #LightGBM分类器
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
from catboost import CatBoostClassifier #CatBoost分类器
from sklearn.tree import DecisionTreeClassifier #决策树分类器
from sklearn.naive_bayes import GaussianNB #高斯朴素贝叶斯分类器
from skopt import BayesSearchCV
from skopt.space import Integer
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
data=pd.read_csv(r'data.csv')
#设置中文字体&负号正确显示&图幅
# plt.figure(figsize=(6,4))
plt.rcParams['font.sans-serif']=['Arial Unicode MS']
plt.rcParams['axes.unicode_minus']=True
plt.rcParams['figure.dpi']=100
# plt.figure(figsize=(6,4))
# sns.boxplot(x=data['Annual Income'])
# plt.title('annual income photo')
# plt.xlabel('annual income')
# plt.tight_layout()
# plt.show()
# plt.figure(figsize=(6,4))
# sns.boxplot(x=data['Annual Income'])
# plt.title('年收入箱线图')
# plt.xlabel('年收入')
# plt.tight_layout()
# plt.show()
# sns.boxplot(x='Credit Default',y='Annual Income',data=data)
# plt.title('annual income vs. credit default')
# plt.xlabel('credit default')
# plt.ylabel('annual income')
# plt.xticks([0,1],['否','是'])
# plt.tight_layout()
# plt.show()
# sns.histplot(x='Annual Income',
# hue='Credit Default',
# data=data,
# kde=True,
# element='bars',
# hue_order=[0, 1])
# plt.title('年收入表')
# plt.xlabel('年收入')
# plt.ylabel('数量')
# plt.legend(labels=['否','是'])
# plt.tight_layout()
# plt.show()
# data['Open Accounts Group']=pd.cut(data['Number of Open Accounts'],
# bins=[0,5,10,15,20,float('inf')],
# labels=['0-5','6-10','11-15','16-20','20+'])
# sns.countplot(x='Open Accounts Group',
# hue='Credit Default',
# data=data)
# plt.title('number')
# plt.xlabel('number of open account group')
# plt.ylabel('count')
# plt.legend(labels=['否','是'])
# plt.tight_layout()
# plt.show()
#查看信息
data=pd.read_csv(r'data.csv')
print(f'{data.info()}\n{data.isnull().sum()}\n{data.head()}')
#填补缺失值
for i in data.columns:
if data[i].dtype!='object':
if data[i].isnull().sum()>0:
data[i].fillna(data[i].mean(),inplace=True)
else:
if data[i].isnull().sum()>0:
data[i].fillna(data[i].mode()[0],inplace=True)
#数据编码
mapping={
'10+ years':0,
'9 years':1,
'8 years':2,
'7 years':3,
'6 years':4,
'5 years':5,
'4 years':6,
'3 years':7,
'2 years':8,
'1 year':9,
'< 1 year':10
}
data['Years in current job']=data['Years in current job'].map(mapping)
data=pd.get_dummies(data=data,drop_first=True)
data2=pd.read_csv(r'data.csv')
dummies_list=[]
for i in data.columns:
if i not in data2.columns:
dummies_list.append(i)
for i in dummies_list:
data[i]=data[i].astype(int)
print(data.isnull().sum())
# print(f'{data.info()}\n{data.isnull().sum()}\n{data.head()}\n{data.columns}')
# continuous_features=['Annual Income', 'Years in current job', 'Tax Liens',
# 'Number of Open Accounts', 'Years of Credit History',
# 'Maximum Open Credit', 'Number of Credit Problems',
# 'Months since last delinquent', 'Bankruptcies', 'Current Loan Amount',
# 'Current Credit Balance', 'Monthly Debt', 'Credit Score']
# correlation_matrix=data[continuous_features].corr()
# plt.figure(figsize=(12,10))
# sns.heatmap(correlation_matrix,annot=True,cmap='coolwarm',vmin=-1,vmax=1)
# plt.title('相关热力图')
# plt.xticks(rotation=45,ha='right')
# plt.show()
features=['Annual Income','Years in current job','Tax Liens','Number of Open Accounts']
# fig,axes=plt.subplots(2,2,figsize=(6,4))
# for i in range(len(features)):
# row=i//2
# col=i%2
# feature=features[i]
# axes[row,col].boxplot(data[feature].dropna())
# axes[row,col].set_title(f'boxplot of {feature}')
# axes[row,col].set_ylabel(feature)
# plt.show()
# fig,axes=plt.subplots(2,2,figsize=(6,4))
# for i,feature in enumerate(features):
# row=i//2
# col=i%2
# axes[row,col].boxplot(data[feature])
# axes[row,col].set_title(f'boxplot of {feature}')
# axes[row,col].set_ylabel(feature)
# plt.tight_layout()
# plt.show()
# fig,axes=plt.subplots(2,2,figsize=(6,4))
# for i,feature in enumerate(features):
# row=i//2
# col=i%2
# sns.boxplot(y=data[feature],ax=axes[row,col])
# axes[row,col].set_title(f'boxplot of {feature}')
# axes[row,col].set_ylabel(feature)
# plt.show()
# fig,axes=plt.subplots(2,2,figsize=(6,4))
# for i,feature,in enumerate(features):
# row=i//2
# col=i%2
# sns.histplot(
# x=feature,
# hue='Credit Default',
# data=data,
# kde=True,
# element='step',
# ax=axes[row,col]
# )
# axes[row,col].set_title(f'aa')
# axes[row,col].set_xlabel(feature)
# axes[row,col].set_ylabel(f'count')
# plt.show()
# fig,axes=plt.subplots(2,2,figsize=(6,4))
# for i,feature in enumerate(features):
# row=i//2
# col=i%2
# sns.histplot(
# x=feature,
# hue='Credit Default',
# data=data,
# kde=True,
# element='step',
# ax=axes[row,col]
# )
# axes[row,col].set_title(f'aa')
# axes[row,col].set_xlabel(feature)
# axes[row,col].set_ylabel(f'count')
# plt.tight_layout()
# plt.show()
from sklearn .model_selection import train_test_split
x=data.drop(['Credit Default'],axis=1)
y=data['Credit Default']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42)
print(f'train:{x_train.shape}\ntest:{x_test.shape}')
# #SVM
# print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
# start_time=time.time()
# svm_model=SVC(random_state=42)
# svm_model.fit(x_train,y_train)
# svm_pred=svm_model.predict(x_test)
# end_time=time.time()
# print(f'训练与预测耗时:{end_time - start_time:.4f}')
# print('\n SVM分类报告')
# print(classification_report(y_test,svm_pred))
# print(' SVM混淆矩阵')
# print(confusion_matrix(y_test,svm_pred))
# #randomforest
# print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
# start_time=time.time()
# rf_model=RandomForestClassifier(random_state=42)
# rf_model.fit(x_train,y_train)
# rf_pred=rf_model.predict(x_test)
# end_time=time.time()
# print(f'训练与预测耗时:{end_time - start_time:.4f}')
# print('\n随机森林分类报告')
# print(classification_report(y_test,rf_pred))
# print('\n随机森林混淆矩阵')
# print(confusion_matrix(y_test,rf_pred))
# #XGBoost
# print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
# start_time=time.time()
# xgb_model=xgb.XGBClassifier(random_state=42)
# xgb_model.fit(x_train,y_train)
# xgb_pred=xgb_model.predict(x_test)
# end_time=time.time()
# print(f'训练与预测耗时:{end_time - start_time:.4f}')
# print('\nXGBoost分类报告')
# print(classification_report(y_test,xgb_pred))
# print(' XGB混淆矩阵')
# print(confusion_matrix(y_test,xgb_pred))
# #LightGBM
# print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
# start_time=time.time()
# lgb_model=lgb.LGBMClassifier(random_state=42)
# lgb_model.fit(x_train,y_train)
# lgb_pred=lgb_model.predict(x_test)
# end_time=time.time()
# print(f'训练与预测耗时:{end_time - start_time:.4f}')
# print('\nLightGBM分类报告')
# print(classification_report(y_test,lgb_pred))
# print('LGB混淆矩阵')
# print(confusion_matrix(y_test,lgb_pred))
# #网格搜索
# print("\n--- 2. 网格搜索优化随机森林 (训练集 -> 测试集) ---")
# from sklearn.model_selection import GridSearchCV
# param_grid={
# 'n_estimators':[50,100,200],
# 'max_depth':[None,10,20,30,],
# 'min_samples_split':[2,5,10],
# 'min_samples_leaf':[1,2.4]
# }
# grid_search=GridSearchCV(estimator=RandomForestClassifier(random_state=42),
# param_grid=param_grid,
# cv=5,
# n_jobs=-1,
# scoring='accuracy')
# start_time=time.time()
# grid_search.fit(x_train,y_train)
# end_time=time.time()
# print(f'网格搜索耗时:{end_time-start_time:.4f}秒')
# print('最佳参数:',grid_search.best_params_)
# best_model=grid_search.best_estimator_
# best_pred=best_model.predict(x_test)
# print('\n网格搜索优化后的随机森林在测试集上的分类报告')
# print(classification_report(y_test,best_pred))
# print('网格搜索优化后的随机森林在测试集上的混淆矩阵')
# print(confusion_matrix(y_test,best_pred))
#贝叶斯优化
search_space={
'n_estimators':Integer(50,200),
'max_depth':Integer(10,30),
'min_samples_split':Integer(2,10),
'min_samples_leaf':Integer(1,4)
}
bayes_search=BayesSearchCV(
estimator=RandomForestClassifier(random_state=42),
search_spaces=search_space,
n_iter=32,
cv=5,
n_jobs=-1,
scoring='accuracy'
)
start_time=time.time()
bayes_search.fit(x_train,y_train)
end_time=time.time()
print(f'贝叶斯优化耗时:{end_time - start_time:.4f}秒')
print('最佳参数:',bayes_search.best_params_)
best_model=bayes_search.best_estimator_
best_pred=best_model.predict(x_test)
print('\n贝叶斯优化后的随机森林在测试集上的分类报告')
print(classification_report(y_test,best_pred))
print('贝叶斯优化后的随机森林在测试集上的混淆矩阵')
print(confusion_matrix(y_test,best_pred))