PCA 降維實戰:從原理到電信客戶流失數據應用

一、簡介

????????在機器學習領域,數據的特征維度往往較高,這不僅會增加計算的復雜度,還可能導致過擬合等問題。主成分分析(Principal Component Analysis,簡稱 PCA)作為一種經典的降維技術,能夠在保留數據主要信息的前提下,有效降低數據維度,提升模型訓練效率與性能。本文將結合 Python 代碼,以電信客戶流失數據為例,深入講解 PCA 的原理與實戰應用。

二、PCA 原理概述

????????PCA 的核心思想是通過正交變換將原始的高維數據轉換到一個新的坐標系下,使得數據在新坐標系下的方差盡可能大,這些方差較大的方向就被稱為主成分。通俗來講,PCA 就是尋找數據中最具有代表性的幾個方向,將數據投影到這些方向上,從而實現降維。

主要分為以下步驟:

????????數據標準化:對原始數據進行標準化處理,使得每個特征的均值為 0,方差為 1 ,消除不同特征量綱的影響。?

????????計算協方差矩陣:根據標準化后的數據計算協方差矩陣,協方差矩陣描述了各個特征之間的相關性。?

????????計算特征值和特征向量:對協方差矩陣進行特征分解,得到特征值和特征向量。特征值表示了數據在對應特征向量方向上的方差大小,特征值越大,說明該方向上的數據變化越大,包含的信息越多。?

????????選擇主成分:按照特征值從大到小的順序對特征向量進行排序,選取前 k 個特征向量作為主成分。k 的選擇可以根據具體需求,比如保留一定比例的方差(如 90%),或者指定具體的維度。?

????????數據轉換:將原始數據投影到選取的主成分上,得到降維后的數據

?

三、案例實現?

????????本文將通過Python代碼實現,探討決策樹模型在電信客戶流失預測中的應用,并結合PCA降維技術優化模型性能,同時對比降維前后的模型效果。

from sklearn.decomposition import PCA
import pandas as pd
data = pd.read_excel('C:\CODE\機器學習\決策樹算法\電信客戶流失數據.xlsx')
# 數據劃分
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

????????導入庫:首先從sklearn.decomposition模塊導入PCA類,用于執行主成分分析進行數據降維;導入pandas庫并簡寫成pd,用于數據的讀取和處理。?

????????讀取數據:使用pd.read_excel()函數讀取本地路徑'C:\CODE\機器學習\決策樹算法\電信客戶流失數據.xlsx'下的 Excel 文件,并將數據存儲在data變量中。這里需要注意,如果文件路徑中包含空格或特殊字符,可能會導致讀取失敗,可使用原始字符串(在字符串前加r)或者對路徑中的特殊字符進行轉義處理 。?

????????數據劃分:通過iloc方法對數據進行劃分。X = data.iloc[:, :-1]表示選取data中除最后一列以外的所有列,作為特征矩陣,即包含客戶的各種屬性信息;y = data.iloc[:, -1]表示選取data中的最后一列,作為目標變量,即表示客戶是否流失。

pca = PCA(n_components=0.90) # 實例化PCA對象
pca.fit(X) #進行訓練,不需要傳入y
print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)
print('PCA降維后數據:')
new_x = pca.transform(X)
print(new_x) # 數據X在主成分空間中的表示,具體來說,這個方法將數據X從原始特征空間轉換到主成分空間

?

????????實例化 PCA 對象:創建PCA類的實例pca,并設置參數n_components=0.90,這意味著模型會自動選擇能夠保留原始數據 90% 方差的主成分數量,以此來確定降維后的維度。?

????????模型訓練:調用pca.fit(X)方法,使用特征矩陣X對PCA模型進行訓練。在這個過程中,模型會計算數據的協方差矩陣、特征值和特征向量等,以確定主成分的方向和重要性。這里不需要傳入目標變量y,因為PCA是一種無監督學習方法,僅依賴數據本身的特征結構進行降維 。?

????????查看方差信息:通過pca.explained_variance_ratio_屬性獲取每個主成分所解釋的方差比例。sum(pca.explained_variance_ratio_)計算所有選取主成分解釋方差的總和,并打印輸出 “特征所占百分比”,幫助我們了解降維后的數據保留了多少原始數據的信息。同時,單獨打印pca.explained_variance_ratio_,展示每個主成分具體的方差解釋比例。?

????????數據降維:調用pca.transform(X)方法,將原始特征矩陣X轉換到主成分空間,得到降維后的數據new_x。此時,new_x的維度已經根據之前設定的保留 90% 方差的條件進行了縮減,包含了數據在主成分方向上的投影信息。

from  sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(new_x, y, test_size=0.2, random_state=0)
xtrain1,xtest1,ytrain1,ytest1 = train_test_split(X, y, test_size=0.2, random_state=0)

?????????導入函數:從sklearn.model_selection模塊導入train_test_split函數,該函數用于將數據集劃分為訓練集和測試集。?

????????劃分降維后的數據:使用train_test_split(new_x, y, test_size=0.2, random_state=0)將降維后的數據new_x和對應的目標變量y進行劃分。其中,test_size=0.2表示測試集占總數據集的 20%,random_state=0用于設置隨機種子,確保每次運行代碼時劃分的數據集是相同的,方便結果的復現和對比 。劃分后得到訓練集特征xtrain、測試集特征xtest、訓練集目標變量ytrain和測試集目標變量ytest。?

????????劃分原始數據:同樣使用train_test_split(X, y, test_size=0.2, random_state=0)對原始特征矩陣X和目標變量y進行劃分,得到另一組訓練集和測試集xtrain1、xtest1、ytrain1、ytest1,用于后續與降維后數據訓練的模型進行對比。

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier1 = LogisticRegression()
classifier.fit(xtrain,ytrain)
classifier1.fit(xtrain1,ytrain1)

????????導入模型:從sklearn.linear_model模塊導入LogisticRegression類,即邏輯回歸模型,這是一種常用的分類模型,適用于二分類問題,在本案例中用于預測客戶是否流失。?

????????實例化模型:分別創建兩個LogisticRegression類的實例classifier和classifier1,后續將使用它們分別對降維后的數據和原始數據進行訓練。?

????????模型訓練:調用classifier.fit(xtrain,ytrain)使用降維后的訓練集xtrain和對應的訓練集目標變量ytrain對classifier模型進行訓練;調用classifier1.fit(xtrain1,ytrain1)使用原始訓練集xtrain1和ytrain1對classifier1模型進行訓練。在訓練過程中,模型會根據輸入的特征和目標變量,學習特征與目標之間的關系,調整模型的參數。

# 訓練測試集
from sklearn import metrics
train_pred = classifier.predict(xtrain)
print(metrics.classification_report(ytrain, train_pred))test_pred = classifier.predict(xtest)
print(metrics.classification_report(ytest, test_pred))
print(classifier.score(xtest, ytest))train1_pred = classifier1.predict(xtrain1)
print(metrics.classification_report(ytrain1, train1_pred))test1_pred = classifier1.predict(xtest1)
print(metrics.classification_report(ytest1, test1_pred))
print(classifier1.score(xtest1, ytest1))

????????導入評估指標模塊:從sklearn庫導入metrics模塊,該模塊提供了多種用于評估分類模型性能的指標和函數。?

????????評估降維后模型在訓練集上的性能:使用classifier.predict(xtrain)讓訓練好的classifier模型對降維后的訓練集xtrain進行預測,得到預測結果train_pred。然后通過metrics.classification_report(ytrain, train_pred)生成分類報告,展示模型在訓練集上的精確率(precision)、召回率(recall)、F1 值(f1-score)等指標,用于評估模型在訓練數據上的表現 。?

????????評估降維后模型在測試集上的性能:使用classifier.predict(xtest)對降維后的測試集xtest進行預測,得到測試集預測結果test_pred。同樣通過metrics.classification_report(ytest, test_pred)生成測試集的分類報告,并使用classifier.score(xtest, ytest)計算模型在測試集上的準確率(accuracy),即預測正確的樣本數占總樣本數的比例,綜合評估模型的泛化能力。?

????????評估原始數據模型在訓練集和測試集上的性能:對基于原始數據訓練的classifier1模型,重復上述步驟。使用classifier1.predict(xtrain1)和classifier1.predict(xtest1)分別對原始訓練集xtrain1和測試集xtest1進行預測,通過metrics.classification_report和classifier1.score評估模型在原始數據訓練集和測試集上的性能,最后對比兩組模型的性能指標,分析 PCA 降維對模型性能的影響。

完整代碼:

from sklearn.decomposition import PCA
import pandas as pddata = pd.read_excel('C:\CODE\機器學習\決策樹算法\電信客戶流失數據.xlsx')# 數據劃分
X = data.iloc[:, :-1]
y = data.iloc[:, -1]pca = PCA(n_components=0.90) # 實列化PCA對象
pca.fit(X) #進行訓練,不需要傳入yprint('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)print('PCA降維后數據:')
new_x = pca.transform(X)
print(new_x) # 數據X在主成分空間中的表示,具體來說,這個方法將數據X從原始特征空間轉換到主成分空間from  sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(new_x, y, test_size=0.2, random_state=0)
xtrain1,xtest1,ytrain1,ytest1 = train_test_split(X, y, test_size=0.2, random_state=0)from sklearn.linear_model import LogisticRegressionclassifier = LogisticRegression()
classifier1 = LogisticRegression()
classifier.fit(xtrain,ytrain)
classifier1.fit(xtrain1,ytrain1)# 訓練測試集
from sklearn import metrics
train_pred = classifier.predict(xtrain)
print(metrics.classification_report(ytrain, train_pred))test_pred = classifier.predict(xtest)
print(metrics.classification_report(ytest, test_pred))
print(classifier.score(xtest, ytest))train1_pred = classifier1.predict(xtrain1)
print(metrics.classification_report(ytrain1, train1_pred))
test1_pred = classifier1.predict(xtest1)
print(metrics.classification_report(ytest1, test1_pred))
print(classifier1.score(xtest1, ytest1))

運行結果:

????????通過運行上述代碼,我們可以得到降維前后邏輯回歸模型在訓練集和測試集上的性能指標。對比這些指標,我們可以觀察到 PCA 降維對模型性能的影響。在實際應用中,PCA 降維可能會提高模型的泛化能力,減少過擬合現象,同時降低計算復雜度,提高訓練效率。當然,具體的效果還需要根據數據特點和模型類型進行綜合分析。

四、總結

????????本文詳細介紹了 PCA 降維的原理,并通過 Python 代碼在電信客戶流失數據上進行了實戰演示。PCA 作為一種強大的降維工具,在機器學習和數據分析中有著廣泛的應用。通過合理使用 PCA,可以有效處理高維數據,提升模型的性能和效率。希望本文的內容能夠幫助讀者更好地理解和應用 PCA 降維技術,在實際項目中發揮其優勢。

?

?

?

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

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

相關文章

信創時代編程開發語言選擇指南:國產替代背景下的技術路徑與實踐建議

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開…

Arcgis10.1的漢化包及破解文件分享

Arcgis10.1的漢化包分享 網上有好多10.2的漢化包,但是10.1的漢化包很少,特在此分析出來給大家 Arcgis10.1破解文件及漢化包: (訪問密碼: 9784) license manager破解安裝文件 另外也分享了license manager破解安裝文件,也在相同的分享鏈接里…

CrewAI Community Version(一)——初步了解以及QuickStart樣例

目錄 1. CrewAI簡介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安裝2.1 安裝uv2.2 安裝CrewAI CLI 3. 官網QuickStart樣例3.1 創建CrewAI Crews項目3.2 項目結構3.3 .env3.4 智能體角色及其任務3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…

word選中所有的表格——宏

Sub 選中所有表格()Dim aTable As TableApplication.ScreenUpdating FalseActiveDocument.DeleteAllEditableRanges wdEditorEveryoneFor Each aTable In ActiveDocument.TablesaTable.Range.Editors.Add wdEditorEveryoneNextActiveDocument.SelectAllEditableRanges wdEdito…

Tkinter與ttk模塊對比:構建現代 Python GUI 的進化之路

在 Python GUI 開發中,標準庫 tkinter 及其子模塊 ttk(Themed Tkinter)常被同時使用。本文通過功能對比和實際案例,簡單介紹這兩個模塊的核心差異。 1. 區別 Tkinter:Python 標準 GUI 工具包(1994年集成&…

Linux系統之部署Dillinger個人文本編輯器

Linux系統之部署Dillinger個人文本編輯器 一、Dillinger介紹1.1 Dillinger簡介1.2 Dillinger特點1.3 使用場景二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本四、部署Node.js 環境4.1 下載Node.js安裝包4.2 解…

從malloc到free:動態內存管理全解析

1.為什么要有動態內存管理 我們已經掌握的內存開辟方法有: int main() {int val 20;//在棧空間上開辟四個字節char arr[20] { 0 };//在棧空間上開辟10個字節的連續空間return 0; }上述開辟的內存空間有兩個特點: 1.空間開辟的時候大小已經固定 2.數組…

健身房管理系統設計與實現(springboot+ssm+vue+mysql)含萬字詳細文檔

健身房管理系統設計與實現(springbootssmvuemysql)含萬字詳細文檔 健身房管理系統是一個全面的解決方案,旨在幫助健身房高效管理日常運營。系統主要功能模塊包括個人中心、會員管理、員工管理、會員卡管理、會員卡類型管理、教練信息管理、解聘管理、健身項目管理、…

seate TCC模式案例

場景描述 用戶下單時,需要創建訂單并從用戶賬戶中扣除相應的余額。如果訂單創建成功但余額劃扣失敗,則需要回滾訂單創建操作。使用 Seata 的 TCC 模式來保證分布式事務的一致性。 1. 項目結構 假設我們有兩個微服務: Order Service&#x…

【Linux】Rhcsa復習5

一、Linux文件系統權限 1、文件的一般權限 文件權限針對三類對象進行定義: owner 屬主,縮寫u group 屬組, 縮寫g other 其他,縮寫o 每個文件針對每類訪問者定義了三種主要權限: r:read 讀 w&…

《Operating System Concepts》閱讀筆記:p748-p748

《Operating System Concepts》學習第 64 天,p748-p748 總結,總計 1 頁。 一、技術總結 1.Transmission Control Protocol(TCP) 重點是要自己能畫出其過程,這里就不贅述了。 二、英語總結(生詞:3) transfer, transport, tran…

C語言之圖像文件的屬性

🌟 嗨,我是LucianaiB! 🌍 總有人間一兩風,填我十萬八千夢。 🚀 路漫漫其修遠兮,吾將上下而求索。 圖像文件屬性提取系統設計與實現 目錄 設計題目設計內容系統分析總體設計詳細設計程序實現…

opencv--基礎

opencv OpenCV是一個實現數字圖像處理和計算機視覺通用算法的開源跨平臺庫。 鏈接 opencv中的cv是什么意思 在OpenCV中,"cv" 是 "Computer Vision"(計算機視覺) 的縮寫。 opencv的實現語言 opencv的底層實現代碼是使…

Java創建對象的方式

1、通過new關鍵字創建新對象 用new關鍵字創建對象是我們在開發中最常用的方式,new關鍵字會為我們在堆內存中開辟一塊空間以存放對象的引用(包含對象本身以及內部屬性的引用)。 2、通過newInstance()方法創建新對象 newInstance()方法本質上是…

構建具備推理與反思能力的高級 Prompt:LLM 智能代理設計指南

在構建強大的 AI 系統,尤其是基于大語言模型(LLM)的智能代理(Agent)時,Prompt 設計的質量決定了系統的智能程度。傳統 Prompt 通常是簡單的問答或填空式指令,而高級任務需要更具結構性、策略性和…

豬行為視頻數據集

豬行為數據集包含 23 天(超過 6 周)的日間豬行為視頻,這些視頻由近乎架空的攝像機拍攝。視頻已配準顏色和深度信息。數據以每秒 6 幀的速度捕獲,并以 1800 幀(5 分鐘)為一批次進行存儲。大多數幀顯示 8 頭豬。 這里可以看到顏色和深度圖像的示例: 喂食器位于圖片底部中…

C++運算符重載詳解

C++ 中的運算符重載允許為用戶自定義類型(類或結構體)賦予運算符特定功能,使其操作更直觀。以下是運算符重載的關鍵點: 1. 基本語法 成員函數重載:運算符作為類的成員函數,左操作數為當前對象 (this),右操作數為參數。 class Complex {public:Complex operator+(const …

deep-share開源瀏覽器擴展,用于分享 DeepSeek 對話,使用戶能夠將對話內容保存為圖片或文本以便輕松分享

一、軟件介紹 文末提供程序和源碼下載學習 deep-share開源瀏覽器擴展,用于分享 DeepSeek 對話,使用戶能夠將對話內容保存為圖片或文本以便輕松分享。 二、軟件功能 One-click capture of DeepSeek chat content一鍵捕獲 DeepSeek 聊天內容Support sha…

Unity之如何實現RenderStreaming視頻推流

文章目錄 前言引入 UnityRenderStreaming 的好處教程步驟 1:設置環境步驟 2: 創建項目步驟 3:安裝軟件包步驟 5:下載示例步驟 6:檢查配置環境步驟 7:打開推流場景步驟 8: 準備用于流式傳輸的WebServer應用程序步驟 9: 運行 示例場景步驟 10:檢查視頻是否在瀏覽器中顯示…

30天開發操作系統 第26天 -- 為窗口移動提速

前言 昨天我們增加了可同時啟動的應用程序的數量,窗口也跟著變多了,整個畫面變得熱鬧起來。 話說,在對比color.hrb和color2.hrb的時候我們需要移動窗口,那個時候筆者感到窗口移動的速度很慢。在真機環境下的速度還算可以接受&…