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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeBuddy 开发 JSON 可视化工具实录:JsonVision 的诞生之旅

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 &#x1f9ed; 项目起点&#xff1a;一个灵光一现的念头 在日常的前端开发中&#xff0c;我时常需要调试复杂的…

Redis学习专题(一)配置和持久化

目录 一.配置Redis 1.配置application.properties 2. 配置Config 3.测试连接redis 二、Redis持久化 持久化方案 RDB&#xff1a; 1、RDB基础认识 1、具体流程如下&#xff1a; 3、小结&#xff1a; 3、Fork&Copy-On-Write 4、RDB的配置 5、默认快照的配置 6、…

[ctfshow web入门] web77

信息收集 上一题的读取flag方式不能用了&#xff0c;使用后的回显是&#xff1a;could not find driver 解题 同样的查目录方法 cvar_export(scandir("glob:///*"));die();cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString…

每日算法刷题Day8 5.16:leetcode定长滑动窗口4道题,用时1h

5. 2379.得到k个黑块的最少涂色次数(简单) 2379. 得到 K 个黑块的最少涂色次数 - 力扣&#xff08;LeetCode&#xff09; 思想 1.返回至少出现 一次 连续 k 个黑色块的 最少 操作次数 2.还是定长k&#xff0c;统计量就是把白色变成黑色的操作次数&#xff0c;无需记录当前有…

很啰嗦,再次总结 DOM

DOM (文档对象模型) 详解 一、DOM 基础概念 1. 定义与作用 DOM&#xff08;Document Object Model&#xff09;即文档对象模型&#xff0c;是一种用于 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构&#xff0c;允许程序和脚本动态访问、修改文…

ES6 (ECMAScript 2015) 详解

文章目录 一、ES6简介1.1 什么是ES6&#xff1f;1.2 为什么要学习ES6&#xff1f;1.3 浏览器支持情况 二、let和const关键字2.1 let关键字2.2 const关键字2.3 var、let和const的选择 三、箭头函数3.1 基本语法3.2 箭头函数的特点3.3 何时使用箭头函数 四、模板字符串4.1 基本语…

LeetCode 746 使用最小花费爬楼梯

当然可以&#xff01;LeetCode 746 是一道经典的动态规划入门题&#xff0c;我来用 C 为你详细解释。 题目描述 给定一个整数数组 cost&#xff0c;其中每个元素 cost[i] 表示从第 i 个台阶向上爬需要支付的费用。一旦支付费用&#xff0c;你可以选择向上爬 1 步 或 2 步。 你…

6.1.1图的基本概念

基本概念 图&#xff1a; 顶点集边集 顶点集&#xff1a;所有顶点的集合&#xff0c;不能为空&#xff08;因为图是顶点集和边集组成&#xff0c;其中一个顶点集不能为空&#xff0c;则图肯定不为空&#xff09; 边集&#xff1a;所有边的集合&#xff0c;边是由顶点集中的2…

WeakAuras Lua Script [TOC BOSS 5 - Anub‘arak ]

WeakAuras Lua Script [TOC BOSS 5 - Anubarak ] 阿努巴拉克 - 小强中虫范围 插件 !WA:2!DE1B0Xrvv8UmuRmIqZwiaXQmgKycwsYUPjPLZPTz3nBYULKnBNDtlYP6o)7T7mMzNz6BMnnBefBqGacIUOsXIkSIki)rCbLkIhLi6h8t3to6h9G2dXt4R9d(rR33mt2MyepQ75KSV3BUZ9FV7VF37g54rDvgU)yX7)GrRgvlQ2Y…

【C/C++】深度探索c++对象模型_笔记

1. 对象内存布局 (1) 普通类&#xff08;无虚函数&#xff09; 成员变量排列&#xff1a;按声明顺序存储&#xff0c;但编译器会根据内存对齐规则插入填充字节&#xff08;padding&#xff09;。class Simple {char a; // 1字节&#xff08;偏移0&#xff09;int b; …

湖北理元理律师事务所:债务优化中的双维支持实践解析

在债务压力与生活质量失衡的社会议题下&#xff0c;法律服务机构的功能边界正在从单一的法律咨询向复合型支持延伸。湖北理元理律师事务所通过“法律心理”双维服务模式&#xff0c;探索债务优化与生活保障的平衡路径&#xff0c;其方法论或为行业提供实践参考。 法律框架&…

Python uv包管理器使用指南:从入门到精通

Python uv包管理器使用指南&#xff1a;从入门到精通 作为一名Python开发者&#xff0c;你是否曾经为虚拟环境管理和依赖包安装而头疼&#xff1f;今天我要向大家介绍一个强大的工具——uv包管理器&#xff0c;它将彻底改变你的Python开发体验。 什么是uv包管理器&#xff1f…

Windows系统安全加固

掌握的加固点&#xff1a; 用户系统检查 口令策略检查 日志审计检查 安全选项检查 信息保护检查 2.2.1 用户系统检查 #检查系统版本内核 判断依据&#xff1a;无 检查方式&#xff1a;命令 msinfo32 dxdiag查看 #检查Administrator账号是否停用 判断依据&#xff1a;禁…

小蜗牛拨号助手用户使用手册

一、软件简介 小蜗牛拨号助手是一款便捷实用的拨号辅助工具&#xff0c;能自动识别剪贴板中的电话号码&#xff0c;支持快速拨号操作。最小化或关闭窗口后&#xff0c;程序将在系统后台运行&#xff0c;还可设置开机自启&#xff0c;方便随时使用&#xff0c;提升拨号效率。 …

c/c++消息队列库RabbitMQ的使用

RabbitMQ C 消息队列组件设计与实现文档 1. 引言 1.1. RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件&#xff08;也称为面向消息的中间件&#xff09;&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。RabbitMQ 服务器是用 Erlang 语言编写的&#…

线程(二)OpenJDK 17 中线程启动的完整流程用C++ 源码详解之主-子线程通信机制

深入解析OpenJDK 17中Java线程的创建与主-子线程通信机制 引言 在Java中&#xff0c;线程的创建与启动通过Thread.start()实现&#xff0c;但底层是JVM与操作系统协作完成的复杂过程。本文基于OpenJDK 17的C源码&#xff0c;揭秘Java线程创建时主线程与子线程的通信机制&…

多线程爬虫语言选择与实现

之前文中有人提到&#xff1a;想要一个简单易用、能快速实现多线程爬虫的方案&#xff0c;而且目标是小网站&#xff0c;基本可以确定对反爬虫措施要求不高&#xff0c;这些就比较简单了。 以往我肯定要考虑常见的编程语言中哪些适合爬虫。Python、JavaScript&#xff08;Node…

AMD Vivado™ 设计套件生成加密比特流和加密密钥

概括 重要提示&#xff1a;有关使用AMD Vivado™ Design Suite 2016.4 及更早版本进行 eFUSE 编程的重要更新&#xff0c;请参阅AMD设计咨询 68832 。 本应用说明介绍了使用AMD Vivado™ 设计套件生成加密比特流和加密密钥&#xff08;高级加密标准伽罗瓦/计数器模式 (AES-GCM)…

Unity3D仿星露谷物语开发44之收集农作物

1、目标 在土地中挖掘后&#xff0c;洒下种子后逐渐成长&#xff0c;然后使用篮子收集成熟后的农作物&#xff0c;工具栏中也会相应地增加该农作物。 2、修改CropStandard的参数 Assets -> Prefabs -> Crop下的CropStandard&#xff0c;修改其Box Collider 2D的Size(Y…

list重点接口及模拟实现

list功能介绍 c中list是使用双向链表实现的一个容器&#xff0c;这个容器可以实现。插入&#xff0c;删除等的操作。与vector相比&#xff0c;vector适合尾插和尾删&#xff08;vector的实现是使用了动态数组的方式。在进行头删和头插的时候后面的数据会进行挪动&#xff0c;时…