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.pswp.cn/news/905989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905989.shtml
英文地址,請注明出處:http://en.pswp.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;時…