【Python特征工程系列】一文教你使用PCA進行特征分析與降維(案例+源碼)

這是我的第287篇原創文章。

一、引言

? ? ? 主成分分析(Principal Component Analysis, PCA)是一種常用的降維技術,它通過線性變換將原始特征轉換為一組線性不相關的新特征,稱為主成分,以便更好地表達數據的方差。

? ? ? 在特征重要性分析中,PCA 可以用于理解數據中最能解釋方差的特征,并幫助識別對目標變量影響最大的特征。可以通過查看PCA的主成分(主特征向量)以及各主成分所對應的特征重要性來推斷哪些原始特征在新特征中起到了較大影響。

? ? ? PCA 的局限性:

  • PCA 是一種線性變換方法,可能無法很好地處理非線性關系的數據。
  • PCA 可能會丟失一些信息,因為它主要關注的是數據中的方差,而忽略了其他方面的信
  • PCA 假設主成分與原始特征之間是線性關系,這在某些情況下可能不成立。

二、實現過程

2.1 讀取數據

# 準備數據
data = pd.read_csv(r'dataset.csv')
df = pd.DataFrame(data)
print(df)
# 目標變量和特征變量
target = 'target'
features = df.columns.drop(target)
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=0)

df:

圖片

2.2 對訓練集做PCA主成分分析

自主選擇主成分,并打印出每個主成分的解釋性方差:

pca = PCA(n_components='mle')
pca.fit(X_train)
var_ratio = pca.explained_variance_ratio_
for idx, val in enumerate(var_ratio, 1):print("Principle component %d: %.2f%%" % (idx, val * 100))
print("total: %.2f%%" % np.sum(var_ratio * 100))

結果:

圖片

共計10個主成分。

2.3 通過主成分分析原始特征重要性

打印出每個特征對于主成分的系數,這反映了原始特征的重要性:

print(pca.components_)

結果:

圖片

通過計算10個主成分中,每個原始特征的系數絕對值之和作為該特征的最終貢獻度:

# 計算原始特征與主成分的相關性(絕對值)
feature_importance?=?np.abs(pca.components_)
# 計算每個主成分中原始特征的權重(系數)和
feature_importance_sum?=?np.sum(feature_importance,?axis=0)
# 打印原始特征的重要性(貢獻度)
print("\n原始特征的重要性(貢獻度):")
ranking_df?=?pd.DataFrame({'特征':?features,?'貢獻度':?feature_importance_sum})
ranking_df = ranking_df.sort_values(by='貢獻度')
print(ranking_df)

結果:

圖片

可視化:

圖片

2.4 查看累計解釋方差比率與主成分個數的關系

fig, ax = plt.subplots(figsize=(10, 7))
ax.plot(np.arange(1, len(var_ratio) + 1), np.cumsum(var_ratio), "-ro")
ax.set_title("Cumulative Explained Variance Ratio", fontsize=15)
ax.set_xlabel("number of components")
ax.set_ylabel("explained variance ratio(%)")
plt.show()

結果:

圖片

前2個主成分累計解釋性方差比率接近0.9,前3個主成分累計解釋方差比率超過0.95。

2.5 自動選擇最優的主成分個數

設定累計解釋方差比率的目標,讓sklearn自動選擇最優的主成分個數:

target = 0.9  # 保留原始數據集90%的變異
res = PCA(n_components=target).fit_transform(X_train)
print("original shape: ", X_train.shape)
print("transformed shape: ", res.shape)

結果:

圖片

選擇了3個主成分。

2.6 主成分選擇可視化(以2個主成分為例)

選擇兩個主成分,并進行可視化:

pca=PCA(n_components=2)  #加載PCA算法,設置降維后主成分數目為2
reduced_x=pca.fit_transform(X_train)#對樣本進行降維
principalDf = pd.DataFrame(data = reduced_x, columns = ['principal component 1', 'principal component 2'])
print(principalDf)
y_train = np.array(y_train)
yes_x,yes_y=[],[]
no_x,no_y=[],[]
for i in range(len(reduced_x)):if y_train[i] ==1:yes_x.append(reduced_x[i][0])yes_y.append(reduced_x[i][1])elif y_train[i]==0:no_x.append(reduced_x[i][0])no_y.append(reduced_x[i][1])
plt.scatter(yes_x,yes_y,c='r',marker='x')
plt.scatter(no_x,no_y,c='b',marker='D')
plt.xlabel("First Main Component")
plt.ylabel("Second Main Component")
plt.show()

結果:

圖片

可以看出2個主成分可以大概劃分出兩類。

作者簡介:

讀研期間發表6篇SCI數據挖掘相關論文,現在某研究院從事數據算法相關科研工作,結合自身科研實踐經歷不定期分享關于Python、機器學習、深度學習、人工智能系列基礎知識與應用案例。致力于只做原創,以最簡單的方式理解和學習,關注我一起交流成長。需要數據集和源碼的小伙伴可以關注底部公眾號添加作者微信。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16106.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DAMA數據管理知識體系必背18張框圖

近期對數據管理知識體系中比較重要的框圖進行了梳理總結,總共有18張框圖,供大家參考。主要涉及數據管理、數據治理階段模式、數據安全需求、主數據管理關鍵步驟,主數據架構、DW架構、數據科學的7個階段、數據倉庫建設活動、信息收斂三角、大數據分析架構圖、數據管理成熟度等…

QGIS開發筆記(二):Windows安裝版二次開發環境搭建(上):安裝OSGeo4W運行依賴其Qt的基礎環境Demo

若該文為原創文章,轉載請注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139136356 長沙紅胖子Qt(長沙創微智科)博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV…

如果返回的json 中有 ‘///’ 轉換

// 將返回數據的三條/和替換空 rowData.Jsonobj rowData.Jsonobj .replace(/^\s*\/\/\/.*$/gm, //); // 將返回的替換成" 并且外面加個"" rowData.Jsonobj "${rowData.Jsonobj .replace(//g, ")}"; // 轉換回來數據用兩個 JSON.parse(JSON.par…

Charles抓包App_https_夜神模擬器

Openssl安裝 下載安裝 下載地址: http://slproweb.com/products/Win32OpenSSL.html 我已經下載好了64位的,也放出來: 鏈接:https://pan.baidu.com/s/1Nkur475YK48_Ayq_vEm99w?pwdf4d7 提取碼:f4d7 --來自百度網…

地下城游戲(leetcode)

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 地下城游戲https://leetcode.cn/problems/dungeon-game/description/ 圖解分析&#xff1a; 代碼 class Solution { public:int calculateMinimumHP(vector<vector<int>>& vv) {int row vv.size(), col …

Zookeeper 安裝教程和使用指南

一、Zookeeper介紹 ZooKeeper 是 Apache 軟件基金會的一個開源項目&#xff0c;主要基于 Java 語言實現。 Apache ZooKeeper 是一個開源的分布式應用程序協調服務&#xff0c;提供可靠的數據管理通知、數據同步、命名服務、分布式配置服務、分布式協調等服務。 關鍵特性 分布…

Nginx實戰(安裝部署、常用命令、反向代理、負載均衡、動靜分離)

文章目錄 1. nginx安裝部署1.1 windows安裝包1.2 linux-源碼編譯1.3 linux-docker安裝 2. nginx介紹2.1 簡介2.2 常用命令2.3 nginx運行原理2.3.1 mater和worker2.3.3 Nginx 的工作原理 2.4 nginx的基本配置文件2.4.1 location指令說明 3. nginx案例3.1 nginx-反向代理案例013.…

數據結構和算法|排序算法系列(三)|插入排序(三路排序函數std::sort)

首先需要你對排序算法的評價維度和一個理想排序算法應該是什么樣的有一個基本的認知&#xff1a; 《Hello算法之排序算法》 主要內容來自&#xff1a;Hello算法11.4 插入排序 插入排序的整個過程與手動整理一副牌非常相似。 我們在未排序區間選擇一個基準元素&#xff0c;將…

移動云以深度融合之服務,令“大”智慧貫穿云端

移動云助力大模型&#xff0c;開拓創新領未來。 云計算——AI模型的推動器。 當前人工智能技術發展的現狀和趨勢&#xff0c;以及中國在人工智能領域的發展策略和成就。確實&#xff0c;以 ChatGPT 為代表的大型語言模型在自然語言處理、文本生成、對話系統等領域取得了顯著的…

項目管理:敏捷實踐框架

一、初識敏捷 什么是敏捷(Agile)?敏捷是思維方式。 傳統開發模型 央企,國企50%-60%需求分析。整體是由文檔控制的過程管理。 傳統軟件開發面臨的問題: 交付周期長:3-6個月甚至更長溝通效果差:文檔化溝通不及時按時發布低:技術債增多無法發版團隊士氣弱:死亡行軍不關注…

Vmware 17安裝 CentOS9

前言 1、提前下載好需要的CentOS9鏡像&#xff0c;下載地址&#xff0c;這里下載的是x86_64 2、提前安裝好vmware 17&#xff0c;下載地址 &#xff0c;需要登錄才能下載 安裝 1、創建新的虛擬機 2、在彈出的界面中選擇對應的類型&#xff0c;我這里選擇自定義&#xff0c;點…

python command亂碼怎么解決

python command亂碼怎么解決&#xff1f;具體方法如下&#xff1a; 先引入import sys 再加一句&#xff1a;typesys.getfilesystemencoding() 然后在輸出亂碼的數據的后面加上“.decode(utf-8).encode(type)”。 比如輸入“ss”亂碼。 就寫成print ss.decode(utf-8).encode(typ…

USB - Host controller類型介紹

USB 主機控制器類型 USB 主機控制器是計算機系統中的重要組件&#xff0c;負責管理計算機與連接的 USB 設備之間的通信。多年來&#xff0c;針對不同的 USB 標準和數據傳輸速率&#xff0c;開發了多種類型的 USB 主機控制器。以下是主要 USB 主機控制器類型的概述&#xff1a; …

【話題】AIGC行業現在適合進入嗎

大家好&#xff0c;我是全棧小5&#xff0c;歡迎閱讀小5的系列文章&#xff0c;這是《話題》系列文章 目錄 引言AIGC的發展階段市場需求時機是否合適優勢挑戰 文章推薦 引言 在撰寫關于當前是否適合進入AIGC&#xff08;人工智能生成內容&#xff09;行業的文章之前&#xff0…

從零實現Llama3中文版

1.前言 一個月前&#xff0c;Meta 發布了開源大模型 llama3 系列&#xff0c;在多個關鍵基準測試中優于業界 SOTA 模型&#xff0c;并在代碼生成任務上全面領先。 此后&#xff0c;開發者們便開始了本地部署和實現&#xff0c;比如 llama3 的中文實現、llama3 的純 NumPy 實現…

數據結構——鏈式二叉樹知識點以及鏈式二叉樹數據操作函數詳解!!

引言&#xff1a;該博客將會詳細的講解二叉樹的三種遍歷方法&#xff1a;前序、中序、后序&#xff0c;也同時會講到關于二叉樹的數據操作函數。值得一提的是&#xff0c;這些函數幾乎都是建立在一個函數思想——遞歸之上的。這次的代碼其實寫起來十分簡單&#xff0c;用不了幾…

告別紅色波浪線:tsconfig.json 配置詳解

使用PC端的朋友&#xff0c;請將頁面縮小到最小比例&#xff0c;閱讀最佳&#xff01; tsconfig.json 文件用于配置 TypeScript 項目的編譯選項。如果配不對&#xff0c;就會在項目中顯示一波又一波的紅色波浪線&#xff0c;警告你這些地方的類型聲明存在問題。 一般我們遇到這…

在沒有dubbo-admin情況下如何判斷zk中注冊的dubbo服務是否注冊成功

通常我們都是通過dubbo-admin來查看dubbo服務是否注冊成功&#xff0c;那么如果沒有部署dubbo-admind的情況下&#xff0c;我們如何來判斷dubbo服務是否注冊成功&#xff1a; 一、首先我們進入到zookeeper bin目錄下使用以下指令連接到zk: ./zkCli.sh -server ip:port ip&…

Linux文件系統原理

Linux文件系統 馮諾依曼在1945年提出計算機的五大組成部分 運算器&#xff1a;CPU 控制器&#xff1a;CPU 存儲器&#xff1a;內存和硬盤 輸入設備&#xff1a;鼠標、硬盤 輸出設備&#xff1a;顯示器一、硬盤結構 機械硬盤結構 扇區&#xff1a;硬盤的最小存儲單位&#xff…

Transformer講解大綱,寫PPT的可參考

前言 在這個信息如星辰般璀璨的時代,我們被無數的語言和文字包圍。它們如同夜空中閃爍的繁星,每一顆都蘊藏著獨特的故事和知識。然而,如何解讀這些星辰的秘密,如何將它們的光芒匯聚成智慧的海洋,成為了我們這個時代的挑戰。今天,我們將一起探索一種名為Transformer的神秘…