python打卡DAY22

##注入所需库

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

import random

import numpy as np

import time

import shap

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 deap import base, creator, tools, algorithms

from sklearn.model_selection import StratifiedKFold, cross_validate # 引入分层 K 折和交叉验证工具

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标

from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵

from sklearn.metrics import make_scorer#定义函数

import warnings #用于忽略警告信息

warnings.filterwarnings("ignore") # 忽略所有警告信息

#聚类

from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering

from sklearn.preprocessing import StandardScaler

from sklearn.decomposition import PCA

from sklearn.metrics import silhouette_score, calinski_harabasz_score, davies_bouldin_score

#3D可视化

from mpl_toolkits.mplot3d import Axes3D

#设置中文字体&负号正确显示

plt.rcParams['font.sans-serif']=['STHeiti']

plt.rcParams['axes.unicode_minus']=True

plt.rcParams['figure.dpi']=100

#读取数据

data=pd.read_csv(r'data.csv')

#数据填补

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)

dummies_list=[]

data2=pd.read_csv(r'data.csv')

data=pd.get_dummies(data=data,drop_first=True)

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(f'{data.info()}')

#划分数据集

from sklearn.model_selection import train_test_split

x=data.drop(columns=['Credit Default','Id'],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)

#smote

from imblearn.over_sampling import SMOTE

smote=SMOTE(random_state=42)

x_train_smote,y_train_smote=smote.fit_resample(x_train,y_train)

#标准化数据,将自变量标准化,聚类就是从自变量中聚合新的自变量,与因变量无关

scaler=StandardScaler()

x_scaled=scaler.fit_transform(x)

#KMeans++

k_range=range(2,5)

inertia_value=[]

silhouette_scores=[]

ch_scores=[]

db_scores=[]

start_time=time.time()

for k in k_range:

kmeans=KMeans(n_clusters=k,random_state=42)

kmeans_label=kmeans.fit_predict(x_scaled)#提供了每个数据点所属的簇的信息,用于区分不同簇的数据点

inertia_value.append(kmeans.inertia_)

silhouette=silhouette_score(x_scaled,kmeans_label)

silhouette_scores.append(silhouette)

ch=calinski_harabasz_score(x_scaled,kmeans_label)

ch_scores.append(ch)

db=davies_bouldin_score(x_scaled,kmeans_label)

db_scores.append(db)

# print(f'k={k}\n 惯性:{kmeans.inertia_:.2f}\n轮廓系数:{silhouette:.3f}\n CH系数:{ch:.2f}\n DB{db:.3f}')

end_time=time.time()

print(f'聚类分析耗时:{end_time-start_time:.4f}')

#绘制评估指标图

plt.figure(figsize=(12,6))

#肘部法则图

plt.subplot(2,2,1)

plt.plot(k_range,inertia_value,marker='o')

plt.title('肘部法则确定最优聚类数 k(惯性,越小越好)')

plt.xlabel('聚类数 (k)')

plt.ylabel('惯性')

plt.grid(True)

#轮廓系数图

plt.subplot(2,2,2)

plt.plot(k_range,silhouette_scores,marker='o',color='orange')

plt.title('轮廓系数确定最优聚类数 k(越大越好)')

plt.xlabel('聚类数 (k)')

plt.ylabel('轮廓系数')

plt.grid(True)

#CH指数图

plt.subplot(2,2,3)

plt.plot(k_range,ch_scores,marker='o',color='red')

plt.title('Calinski-Harabasz 指数确定最优聚类数 k(越大越好)')

plt.xlabel('聚类数 (k)')

plt.ylabel('CH 指数')

plt.grid(True)

#DB指数图

plt.subplot(2,2,4)

plt.plot(k_range,db_scores,marker='o',color='yellow')

plt.xlabel('聚类数 (k)')

plt.ylabel('DB 指数')

plt.grid(True)

plt.tight_layout()

plt.show()

#选择K值进行聚类

selected_k=3

kmeans=KMeans(n_clusters=selected_k,random_state=42)

kmeans_label=kmeans.fit_predict(x_scaled)

x['KMeans_Cluster']=kmeans_label

##PCA降维

pca=PCA(n_components=3)

x_pca=pca.fit_transform(x_scaled)

# ##聚类可视化

# plt.figure(figsize=(6,5))

# sns.scatterplot(

# x=x_pca[:,0],

# y=x_pca[:,1],

# hue=kmeans_label,

# palette='viridis'

# )

# plt.title(f'KMean Clustering with k={selected_k} (PCA Visualization)')

# plt.xlabel('PCA Component 1')

# plt.ylabel('PCA Component 2')

# plt.show()

# #3D可视化

pca=PCA(n_components=3)

import plotly.express as px

import plotly.graph_objects as go

# 准备数据

df_pca = pd.DataFrame(x_pca, columns=['PC1', 'PC2', 'PC3'])

df_pca['Cluster'] = kmeans_label

# 创建3D散点图

fig = px.scatter_3d(df_pca, x='PC1', y='PC2', z='PC3', color='Cluster',

color_continuous_scale=px.colors.sequential.Viridis,

title=f'KMeans Clustering with k={selected_k} (PCA 3D Visualization)')

# 调整图形

fig.update_layout(scene=dict(xaxis_title='PCA Component 1',

yaxis_title='PCA Component 2',

zaxis_title='PCA Component 3'),

width=1200, height=1000)

# 显示图形

fig.show()

##打印KMeans聚类前几行

print(f'KMeans Cluster labels(k={selected_k}added to x):')

print(x[['KMeans_Cluster']].value_counts())

start_time=time.time()

x1=x.drop('KMeans_Cluster',axis=1)

y1=x['KMeans_Cluster']

rf1_model=RandomForestClassifier(random_state=42,class_weight='balanced')

rf1_model.fit(x1,y1)

explainer=shap.TreeExplainer(rf1_model)

shap_values=explainer.shap_values(x1)

print(shap_values.shape)

end_time=time.time()

print(f'SHAP分析耗时:{end_time-start_time:.4f}')

# --- 1. SHAP 特征重要性条形图 (Summary Plot - Bar) ---

print("--- 1. SHAP 特征重要性条形图 ---")

shap.summary_plot(shap_values[:,:,0],x1,plot_type='bar',show=False)

plt.title('shap feature importance (bar plot)')

plt.tight_layout()

plt.show()

selected_features=['Purpose_debt consolidation','Home Ownership_Home Mortgage','Purpose_home improvements','Purpose_other']

for feature in selected_features:

unique_count=x[feature].nunique()

print(f'{feature}的唯一值数量:{unique_count}')

if unique_count<10:

print(f'{feature}可能是离散型变量')

else:

print(f'{feature}可能是连续性变量')

fig,axes=plt.subplots(2,2,figsize=(10,8))

axes=axes.flatten()

for i,feature in enumerate(selected_features):

axes[i].hist(x[feature],bins=10)

axes[i].set_title(f'histogram of {feature}')

axes[i].set_xlabel(feature)

axes[i].set_ylabel('frequency')

plt.tight_layout()

plt.show()

print(x[['KMeans_Cluster']].value_counts())

x_cluster0=x[x['KMeans_Cluster']==0]

x_cluster1=x[x['KMeans_Cluster']==1]

x_cluster2=x[x['KMeans_Cluster']==2]

x_cluster3=x[x['KMeans_Cluster']==3]

#簇0

fig,axes=plt.subplots(2,2,figsize=(6,4))

axes=axes.flatten()

for i,feature in enumerate(selected_features):

sns.countplot(x=x_cluster0[feature],ax=axes[i])

axes[i].set_title(f'countplot of {feature}')

axes[i].set_xlabel(feature)

axes[i].set_ylabel('count')

plt.tight_layout()

plt.show()

#簇1

fig,axes=plt.subplots(2,2,figsize=(6,4))

axes=axes.flatten()

for i,feature in enumerate(selected_features):

sns.countplot(x=x_cluster1[feature],ax=axes[i])

axes[i].set_title(f'countplot of {feature}')

axes[i].set_xlabel(feature)

axes[i].set_ylabel('count')

plt.tight_layout()

plt.show()

#簇2

fig,axes=plt.subplots(2,2,figsize=(6,4))

axes=axes.flatten()

for i,feature in enumerate(selected_features):

sns.countplot(x=x_cluster2[feature],ax=axes[i])

axes[i].set_title(f'countplot of {feature}')

axes[i].set_xlabel(feature)

axes[i].set_ylabel('count')

plt.tight_layout()

plt.show()

print("--- 递归特征消除 (RFE) ---")

from sklearn.feature_selection import RFE

base_model=RandomForestClassifier(random_state=42,class_weight='balanced')

rfe=RFE(base_model,n_features_to_select=3)

rfe.fit(x_train_smote,y_train_smote)

x_train_rfe=rfe.transform(x_train_smote)

x_test_rfe=rfe.transform(x_test)

selected_features_rfe=x_train.columns[rfe.support_]

print(f"RFE筛选后保留的特征数量: {len(selected_features_rfe)}")

print(f"保留的特征: {selected_features_rfe}")

#3D可视化

import plotly.express as px

import plotly.graph_objects as go

x_selected=x[selected_features_rfe]

df_viz=pd.DataFrame(x_selected)

df_viz['cluster']=x['KMeans_Cluster']

fig=px.scatter_3d(

df_viz,

x=selected_features_rfe[0],

y=selected_features_rfe[1],

z=selected_features_rfe[2],

color='cluster',

color_continuous_scale=px.colors.sequential.Viridis,

title='RFE特征选择的3D可视化'

)

fig.update_layout(

scene=dict(

xaxis_title=selected_features_rfe[0],

yaxis_title=selected_features_rfe[1],

zaxis_title=selected_features_rfe[2]

),

width=1200,

height=1000

)

fig.show()

#训练随机森林模型

rf_model_rfe=RandomForestClassifier(random_state=42,class_weight='balanced')

rf_model_rfe.fit(x_train_rfe,y_train)

rf_pred_rfe=rf_model_rfe.predict(x_test_rfe)

print("\nRFE筛选后随机森林在测试集上的分类报告:")

print(classification_report(y_test, rf_pred_rfe))

print("RFE筛选后随机森林在测试集上的混淆矩阵:")

print(confusion_matrix(y_test, rf_pred_rfe))

相关推荐
CryptoRzz5 分钟前
股票数据源对接技术指南:印度尼西亚、印度、韩国
数据库·python·金融·数据分析·区块链
她说彩礼65万11 分钟前
C# 中的锁
开发语言·c#
2302_8097983212 分钟前
【JavaWeb】JDBC
java·开发语言·servlet
胖哥真不错26 分钟前
Python实现NOA星雀优化算法优化卷积神经网络CNN回归模型项目实战
python·cnn·卷积神经网络·项目实战·cnn回归模型·noa星雀优化算法
繁依Fanyi31 分钟前
ImgShrink:摄影暗房里的在线图片压缩工具开发记
开发语言·前端·codebuddy首席试玩官
卓律涤36 分钟前
【找工作系列①】【大四毕业】【复习】巩固JavaScript,了解ES6。
开发语言·前端·javascript·笔记·程序人生·职场和发展·es6
xqlily1 小时前
MATLAB安装常见问题解决方案
开发语言·matlab
achene_ql1 小时前
基于QT和FFmpeg实现自己的视频播放器FFMediaPlayer(一)——项目总览
开发语言·qt·ffmpeg
MeyrlNotFound1 小时前
(二十一)Java集合框架源码深度解析
java·开发语言
TNTLWT1 小时前
Qt功能区:Ribbon使用
开发语言·qt·ribbon