使用 PCA 可視化數據的分類能力

使用 PCA 探索數據分類的效果(使用 Python 代碼)

「AI秘籍」系列課程:

  • 人工智能應用數學基礎
  • 人工智能Python基礎
  • 人工智能基礎核心知識
  • 人工智能BI核心知識
  • 人工智能CV核心知識

主成分分析 (PCA) 是數據科學家使用的絕佳工具。它可用于降低特征空間維數并生成不相關的特征。正如我們將看到的,它還可以幫助你深入了解數據的分類能力。我們將帶你了解如何以這種方式使用 PCA。提供了 Python 代碼片段,完整項目可在GitHub1上找到。

什么是 PCA?

我們先從理論開始。我不會深入講解太多細節,因為如果你想了解 PCA 的工作原理,有很多很好的資源^2^3。重要的是要知道 PCA 是一種降維算法。這意味著它用于減少用于訓練模型的特征數量。它通過從許多特征中構建主成分 (PC) 來實現這一點。

PC 的構造方式是,第一個 PC(即 PC1)盡可能解釋特征中的大部分變化。然后 PC2 盡可能解釋剩余變化中的大部分變化,依此類推。PC1 和 PC2 通常可以解釋總特征變化的很大一部分。另一種思考方式是,前兩個 PC 可以很好地總結特征。這很重要,因為它使我們能夠在二維平面上直觀地看到數據的分類能力。

img

數據集

好的,讓我們深入研究一個實際的例子。我們將使用 PCA 來探索乳腺癌數據集^4,我們使用以下代碼導入該數據集。目標變量是乳腺癌測試的結果 - 惡性或良性。每次測試都會取出許多癌細胞。然后從每個癌細胞中采取 10 個不同的測量值。這些包括細胞半徑和細胞對稱性等測量值。為了獲得 30 個特征的最終列表,我們以 3 種方式匯總這些測量值。也就是說,我們計算每個測量值的平均值、標準誤差和最大值(“最差”值)。在圖 1 中,我們仔細研究了其中兩個特征 -細胞的平均對稱性最差平滑度。

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()data = pd.DataFrame(cancer['data'],columns=cancer['feature_names'])
data['y'] = cancer['target']

在圖 1 中,我們可以看到這兩個特征有助于區分這兩個類別。也就是說,良性腫瘤往往更對稱、更光滑。重疊部分仍然很多,因此僅使用這些特征的模型效果不會很好。我們可以創建這樣的圖表來了解每個單獨特征的預測能力。盡管有 30 個特征,但需要分析的圖表還是很多。它們也沒有告訴我們整個數據集的預測能力。這就是 PCA 發揮作用的地方。

圖 1:使用兩個特征的散點圖

PCA——整個數據集

讓我們首先對整個數據集進行 PCA。我們使用下面的代碼來執行此操作。我們首先縮放特征,使它們都具有均值為 0 和方差為 1。這很重要,因為 PCA 通過最大化 PC 解釋的方差來工作。由于其規模,某些特征往往會具有更高的方差。例如,以厘米為單位測量的距離的方差將高于以公里為單位測量的相同距離。如果不進行縮放,PCA 將被那些方差較大的特征“壓倒”。

縮放完成后,我們擬合 PCA 模型并將特征轉換為 PC。由于我們有 30 個特征,因此最多可以有 30 個 PC。對于我們的可視化,我們只對前兩個感興趣。你可以在圖 2 中看到這一點,其中使用 PC1 和 PC2 創建了散點圖。我們現在可以看到兩個不同的集群,它們比圖 1 中更清晰。

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA#Scale the data
scaler = StandardScaler()
scaler.fit(data)
scaled = scaler.transform(data)#Obtain principal components
pca = PCA().fit(scaled)pc = pca.transform(scaled)
pc1 = pc[:,0]
pc2 = pc[:,1]#Plot principal components
plt.figure(figsize=(10,10))colour = ['#ff2121' if y == 1 else '#2176ff' for y in data['y']]
plt.scatter(pc1,pc2 ,c=colour,edgecolors='#000000')
plt.ylabel("Glucose",size=20)
plt.xlabel('Age',size=20)
plt.yticks(size=12)
plt.xticks(size=12)
plt.xlabel('PC1')
plt.ylabel('PC2')

該圖可用于直觀地了解數據的預測強度。在本例中,它表明使用整個數據集將使我們能夠區分惡性腫瘤和良性腫瘤。但是,仍然有一些異常值(即不明確位于群集中的點)。這并不意味著我們會對這些情況做出錯誤的預測。我們應該記住,并非所有特征方差都會在前兩個 PC 中捕獲。在完整特征集上訓練的模型可以產生更好的預測。

圖 2:使用所有特征的 PCA 散點圖

此時,我們應該提到這種方法的一個注意事項。PC1 和 PC2 可以解釋特征中很大一部分方差。然而,這并不總是正確的。在某些情況下,PC 可能被認為是特征的糟糕總結。這意味著,即使你的數據可以很好地分離類別,你也可能無法獲得清晰的聚類,如圖 2 所示。

我們可以使用 PCA 碎石圖來確定這是否會是一個問題。我們使用下面的代碼創建了此分析的碎石圖,如圖 3 所示。這是一個條形圖,其中每個條形的高度是相關 PC 解釋的方差百分比。我們看到,PC1 和 PC2 總共只解釋了約 20% 的特征方差。即使只有 20% 的解釋,我們仍然得到兩個不同的聚類。這強調了數據的預測強度。

var = pca.explained_variance_[0:10] #percentage of variance explained
labels = ['PC1','PC2','PC3','PC4','PC5','PC6','PC7','PC8','PC9','PC10']plt.figure(figsize=(15,7))
plt.bar(labels,var,)
plt.xlabel('Pricipal Component')
plt.ylabel('Proportion of Variance Explained')

圖 3. 碎石圖
在這里插入圖片描述

PCA——特征組

我們還可以使用此過程來比較不同的特征組。例如,假設我們有兩組特征。第 1 組具有基于細胞對稱性和平滑度特征的所有特征。而第 2 組具有基于周長和凹度的所有特征。我們可以使用 PCA 來直觀地了解哪組更適合進行預測。

group_1 = ['mean symmetry', 'symmetry error','worst symmetry',
'mean smoothness','smoothness error','worst smoothness']group_2 = ['mean perimeter','perimeter error','worst perimeter', 
'mean concavity','concavity error','worst concavity']

我們首先創建兩組特征。然后分別對每組進行 PCA。這將為我們提供兩組 PC,我們選擇 PC1 和 PC2 來代表每個特征組。該過程的結果可以在圖 4 中看到。

對于第 1 組,我們可以看到有一些分離,但仍然有很多重疊。相比之下,第 2 組有兩個不同的簇。因此,從這些圖中,我們預計第 2 組中的特征是更好的預測因子。使用第 2 組特征訓練的模型應該比使用第 1 組特征訓練的模型具有更高的準確率。現在,讓我們來測試一下這個假設。

圖 4:使用特征組的 PCA 散點圖

我們使用下面的代碼來訓練使用兩組特征的邏輯回歸模型。在每種情況下,我們使用 70% 的數據來訓練模型,其余 30% 的數據來測試模型。第 1 組的測試集準確率為 74%,相比之下,第 2 組的準確率為 97%。因此,第 2 組中的特征是更好的預測因子,這正是我們從 PCA 結果中預期的。

from sklearn.model_selection import train_test_split
import sklearn.metrics as metric
import statsmodels.api as smfor i,g in enumerate(group):x = data[g]x = sm.add_constant(x)y = data['y']x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3, random_state = 101)model = sm.Logit(y_train,x_train).fit() #fit logistic regression modelpredictions = np.around(model.predict(x_test)) accuracy = metric.accuracy_score(y_test,predictions)print("Accuracy of Group {}: {}".format(i+1,accuracy))---
Optimization terminated successfully.Current function value: 0.458884Iterations 7
Accuracy of Group 1: 0.7368421052631579
Optimization terminated successfully.Current function value: 0.103458Iterations 10
Accuracy of Group 2: 0.9707602339181286

最后,我們將了解如何在開始建模之前使用 PCA 來更深入地了解數據。它將讓你了解預期的分類準確度。你還將對哪些特征具有預測性建立直覺。這可以讓你在特征選擇方面占據優勢。

如上所述,這種方法并非萬無一失。它應該與其他數據探索圖和匯總統計數據一起使用。對于分類問題,這些可能包括信息值和箱線圖。一般來說,在開始建模之前,從盡可能多的不同角度查看數據是個好主意。

參考


  1. https://github.com/hivandu/public_articles ??

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

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

相關文章

【QT】容器類控件

目錄 概述 Group Box 核心屬性 Tab Widget 核心屬性 核心信號 核心方法 使用示例: 布局管理器 垂直布局 核心屬性 使用示例: 水平布局 核?屬性 (和 QVBoxLayout 屬性是?致的) 網格布局 核心屬性 使用示例: 示例&#x…

2024亞太杯中文賽數學建模B題word+PDF+代碼

2024年第十四屆亞太地區大學生數學建模競賽(中文賽項)B題洪水災害的數據分析與預測:建立指標相關性與多重共線性分析模型、洪水風險分層與預警評價模型、洪水發生概率的非線性預測優化模型,以及大規模樣本預測與分布特征分析模型 …

UI設計中瀑布流布局方式的特定和例子

在UI設計中,瀑布流布局方式(Waterfall Layout)是一種非常流行且有效的內容展示方式,其特定和例子可以歸納如下: 瀑布流布局的特定 視覺表現: 瀑布流布局呈現為參差不齊的多欄布局,隨著頁面滾…

數據集介紹與使用 M2DGR、KITTI、EuRoc,評測

SLAM 數據集匯總主頁:https://github.com/qxiaofan/awesome-slam-datasets SLAM 數據 集綜述論文:Simultaneous Localization and Mapping Related Datasets: A Comprehensive Survey 論文地址:https://arxiv.org/abs/2102.04036 M2DGR 簡…

JAVA學習-練習試用Java實現“拼接最大數”

問題&#xff1a; 給定長度分別為 m 和 n 的兩個數組&#xff0c;其元素由 0-9 構成&#xff0c;表示兩個自然數各位上的數字。現在從這兩個數組中選出 k (k < m n) 個數字拼接成一個新的數&#xff0c;要求從同一個數組中取出的數字保持其在原數組中的相對順序。 求滿足該…

iview中checkbox多選框帶實際值和顯示值的寫法

<CheckboxGroup v-model"selectHotworkMeasures"><Checkboxv-for"item in hotworkMeasuresList":key"item.key">{{ item.name }}</Checkbox></CheckboxGroup>selectHotworkMeasures: [],

python操作SQLite3數據庫進行增刪改查

python操作SQLite3數據庫進行增刪改查 1、創建SQLite3數據庫 可以通過Navicat圖形化軟件來創建: 2、創建表 利用Navicat圖形化軟件來創建: 存儲在 SQLite 數據庫中的每個值(或是由數據庫引擎所操作的值)都有一個以下的存儲類型: NULL. 值是空值。 INTEGER. 值是有符…

Python 算法交易實驗76 QTV200日常推進

說明 最近實在太忙&#xff0c; 沒太有空推進這個項目&#xff0c;我想還是盡量抽一點點時間推進具體的工程&#xff0c;然后更多的還是用碎片化的時間從整體上對qtv200進行設計完善。有些結構的問題其實是需要理清的&#xff0c;例如&#xff1a; 1 要先基于原始數據進行描述…

浪潮信息元腦服務器支持英特爾?至強?6能效核處理器 展現強勁性能

如今&#xff0c;服務器作為數字經濟的核心基礎設施&#xff0c;正面臨著前所未有的挑戰和機遇。作為服務器領域的領軍企業&#xff0c;浪潮信息始終站在行業前沿&#xff0c;不斷推陳出新&#xff0c;以滿足客戶日益增長的需求。近日&#xff0c;浪潮信息再次展現技術實力&…

基于GWO-CNN-BiLSTM數據回歸預測(多輸入單輸出)-灰狼優化算法優化CNN-BiLSTM

基于GWO-CNN-BiLSTM數據回歸預測(多輸入單輸出)-灰狼優化算法優化CNN-BiLSTM 1.數據均為Excel數據&#xff0c;直接替換數據就可以運行程序。 2.所有程序都經過驗證&#xff0c;保證程序可以運行。 3.具有良好的編程習慣&#xff0c;程序均包含簡要注釋。 獲取方式 https:/…

Pandas 基礎 —— 探索數據分析的第一步

引言 在數據科學的世界中&#xff0c;Pandas 以其強大的數據處理能力而成為分析工作的核心工具。本文將引導你走進 Pandas 的大門&#xff0c;從基礎概念到數據清洗的實用技巧&#xff0c;為你的數據分析之路打下堅實的基礎。 Pandas 簡介 Pandas 是一個開源的 Python 數據分…

篩選Github上的一些優質項目

每個項目旁都有標簽說明其特點&#xff0c;如今日熱捧、多模態、收入生成、機器人、大型語言模型等。 項目涵蓋了不同的編程語言和領域&#xff0c;包括人工智能、語言模型、網頁數據采集、聊天機器人、語音合成、AI 代理工具集、語音轉錄、大型語言模型、DevOps、本地文件共享…

p2p、分布式,區塊鏈筆記:libp2p通過libp2p_demo::network實現文件傳遞功能

代碼 代碼來自github開源項目file-sharing.rs。主要依賴clap庫進行命令行參數解析&#xff0c;使用async_std進行并行操作&#xff0c;使用libp2p_demo::network中的相關方法進行網絡建立與文件傳輸&#xff0c;但是代碼量卻減少了很多&#xff0c;這是由于libp2p_demo::netwo…

Matplotlib 學習

知識點 1.plot()&#xff1a;用于繪制線圖和 散點圖scatter() 函數&#xff1a;plot() 函數可以接受許多可選參數&#xff0c;用于控制圖形的外觀&#xff0c;例如&#xff1a;顏色: colorblue 控制線條的顏色。線型: linestyle-- 控制線條的樣式&#xff0c;例如虛線。標記…

YoloV8改進策略:Block改進|輕量實時的重參數結構|最新改進|即插即用(全網首發)

摘要 本文使用重參數的Block替換YoloV8中的Bottleneck&#xff0c;GFLOPs從165降到了116&#xff0c;降低了三分之一&#xff1b;同時&#xff0c;map50-95從0.937漲到了0.947。 改進方法簡單&#xff0c;只做簡單的替換就行&#xff0c;即插即用&#xff0c;非常推薦&#xf…

C++_STL---list

list的相關介紹 list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 list的底層是帶頭雙向循環鏈表結構&#xff0c;鏈表中每個元素存儲在互不相關的獨立節點中&#xff0c;在節點中通過指針指向其前一個元素和后一個元素。…

IDEA與通義靈碼的智能編程之旅

1 概述 本文主要介紹在IDEA中如何安裝和使用通義靈碼來助力軟件編程,從而提高編程效率,創造更大的個人同企業價值。 2 安裝通義靈碼 2.1 打開IDEA插件市場 點擊IDEA的設置按鈕,下拉選擇Plugins,如下: 2.2 搜索通義靈碼 在搜索框中輸入“通義靈碼”,如下: 2.3 安…

C語言 二分法求方程根

用二分法求下面方程在&#xff08;-10&#xff0c;10&#xff09;的根。 2x^3-4x^23x-60 這個程序使用二分法求方程 2x^3 - 4x^2 3x - 6 0 在區間 (-10, 10) 內的根。 #include <stdio.h> #include <math.h>// 方程 f(x) double f(double x) {return 2 * pow(x…

使用ifconfig命令獲取當前服務器的內網IP地址

如何使用ifconfig命令獲取當前服務器的內網IP地址呢&#xff1f; ifconfig eth0 | grep inet | awk {print $2}

什么是五級流水?銀行眼中的“好流水”,到底是什么樣的?

無論是按揭買房還是日常貸款&#xff0c;銀行流水都是繞不開的一環。規劃好你的流水&#xff0c;不僅能讓你在申請貸款時更有底氣&#xff0c;還可能幫你省下不少冤枉錢。今天&#xff0c;咱們就來一場深度剖析&#xff0c;聊聊如何在按揭貸款、個人經營抵押貸款前&#xff0c;…