01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集及數據集的劃分、特征工程(特征提取與無量綱化、特征降維)

文章目錄

  • 機械學習
    • 機械學習分類
        • 1. 監督學習
        • 2. 半監督學習
        • 3. 無監督學習
        • 4. 強化學習
    • 機械學習的項目開發步驟
  • scikit-learn
    • 1 scikit-learn安裝
    • 2 sklearn數據集
      • 1. sklearn 玩具數據集
        • 鳶尾花數據集
        • 糖尿病數據集
        • 葡萄酒數據集
      • 2. sklearn現實世界數據集
        • 20 新聞組數據集
      • 3. 數據集的劃分
  • 特征工程
    • 1 DictVectorizer - 字典列表特征提取
    • 2 CountVectorizer - 文本特征提取
      • 英文文本提取
      • 中文文本提取
    • 3 TfidfVectorizer TF-IDF - 文本特征詞的重要程度特征提取
    • 4 無量綱化-預處理
      • 1. MaxAbsScaler
      • 2. normalize歸一化
      • 3. StandardScaler
    • 特征降維
        • 1 特征選擇
          • 低方差過濾特征選擇
          • 基于相關系數的特征選擇
        • 2 主成分分析(PCA)

機械學習

機器學習(Machine Learning, ML)是人工智能(AI)的核心分支之一,其核心思想是讓計算機通過對數據的學習,自動發現規律、改進性能,并用于解決預測、決策、模式識別等問題。與傳統編程 “手動編寫規則” 不同,機器學習通過算法從數據中 “自主學習” 規律,實現對未知數據的有效處理。

在這里插入圖片描述

機器學習的本質是 “從數據中學習”:

  • 無需人類顯式編寫處理規則,而是通過算法從大量數據中挖掘潛在模式(如特征與結果的關聯)。
  • 隨著數據量增加或訓練迭代,模型性能會逐漸優化(“學習” 過程)。

機械學習分類

根據數據是否包含 “標簽”(即是否有明確的輸出結果),機器學習可分為以下幾類:

1. 監督學習
  • 特點:訓練數據包含 “輸入特征” 和對應的 “標簽(輸出結果)”,模型通過學習特征與標簽的映射關系,實現對新數據的預測。
  • 典型任務
    • 分類(Classification):預測離散標簽(如 “垃圾郵件 / 正常郵件”“腫瘤良性 / 惡性”)。
    • 回歸(Regression):預測連續數值(如房價、氣溫、股票價格)。
  • 常見算法:線性回歸、邏輯回歸、決策樹、隨機森林、支持向量機(SVM)、神經網絡等。
2. 半監督學習
  • 特點:訓練數據中只有少量標簽,大部分為無標簽數據,模型結合兩種數據進行學習(適用于標簽獲取成本高的場景,如醫學影像標注)。
  • 典型應用:文本分類(少量標注文本 + 大量未標注文本訓練模型)。
3. 無監督學習
  • 特點:訓練數據只有 “輸入特征”,無標簽,模型需自主發現數據中的隱藏結構(如聚類、分布規律)。
  • 典型任務
    • 聚類(Clustering):將相似數據分組(如用戶分群、商品分類)。
    • 降維(Dimensionality Reduction):簡化數據維度(如將高維圖像特征壓縮為低維向量,便于可視化或計算)。
    • 異常檢測(Anomaly Detection):識別與多數數據差異顯著的樣本(如信用卡欺詐檢測)。
  • 常見算法:K-Means 聚類、層次聚類、主成分分析(PCA)、t-SNE(降維可視化)等。
4. 強化學習
  • 特點:模型通過與環境的 “交互” 學習:智能體(Agent)在環境中執行動作,根據動作結果獲得 “獎勵” 或 “懲罰”,最終學習出最大化累積獎勵的策略。
  • 典型任務:游戲 AI(如 AlphaGo 下棋)、機器人控制(如自動駕駛避障)、資源調度等。
  • 常見算法:Q-Learning、策略梯度(Policy Gradient)、深度強化學習(如 DQN)等。

機械學習的項目開發步驟

1.數據集的收集與獲取:

  • 確定數據來源:從數據庫、API、文件或第三方獲取數據。
  • 數據采集:編寫腳本或使用工具(如 Scrapy、Pandas)收集數據。
  • 數據標注:如果是監督學習,需標注訓練數據(如人工標注圖像分類標簽)。

2.數據預處理:

  • 特征工程
    • 特征提取:從原始數據中提取有用特征(如文本分詞、圖像特征提取)。
    • 特征轉換:標準化 / 歸一化數值特征,編碼分類特征。
    • 特征選擇:篩選對目標變量最有預測力的特征。
  • 數據集劃分:將數據分為訓練集、驗證集和測試集

3.模型選擇與訓練

以模型的形式選擇適當的算法和數據表示

清理后的數據分為兩部分 - 訓練和測試。第一部分(訓練數據)用于開發模型。第二部分(測試數據)用作參考依據。

4.模型評估與優化

使用驗證集評估模型性能,選擇合適的評估指標

scikit-learn

Scikit-learn(簡稱 sklearn)是 Python 中最流行的開源機器學習庫之一,提供了豐富的工具和算法,用于數據預處理、模型選擇、訓練和評估。

Scikit-learn官網:https://scikit-learn.org/stable/#

1 scikit-learn安裝

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn

2 sklearn數據集

1. sklearn 玩具數據集

無需額外下載:直接通過 sklearn 導入,方便快捷。

在這里插入圖片描述

鳶尾花數據集
  • 樣本數:150 條。
  • 特征數:4 個(花萼長度、花萼寬度、花瓣長度、花瓣寬度)。
from sklearn.datasets import load_iris
# 加載數據集
iris = load_iris()
print(iris)#--字典
print(iris.data)#數據每一朵花的特征值(特點數據,特征數據)
print(iris.feature_names)#特征名稱:萼片長、萼片寬、花瓣長、花瓣寬
print(iris.target)#每朵花的標簽:0、1、2
print(iris.target_names)#標簽名稱:山鳶尾、變色鳶尾、維吉尼亞鳶尾
糖尿病數據集
  • 樣本數:442 條。
  • 特征數:10 個
  • 特征含義
    1. 年齡
    2. 性別
    3. 體質指數(BMI)
    4. 平均血壓
    5. S1~S6:血液中 6 種血清指標
  • 目標變量
    • 一年后糖尿病病情進展的定量測量值(數值越大表示病情越嚴重)
from sklearn.datasets import load_diabetes
# 獲取數據集
diabetes = load_diabetes()
# 查看數據集
# print(diabetes)
#特征值 和 目標值
x,y = load_diabetes(return_X_y=True)
# print(x,y)
print(x.shape,y.shape)#(442, 10) (442,)
print("特征名稱:", diabetes.feature_names)
#['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
葡萄酒數據集
  • 樣本數:178 個
  • 特征數:13 個(均為連續型數值特征)
  • 特征含義
    1. 酒精含量
    2. 蘋果酸含量
    3. 灰分
    4. 灰分堿度
    5. 鎂含量
    6. 總酚含量
    7. 黃酮類化合物含量
    8. 非黃酮類酚含量
    9. 原花青素含量
    10. 顏色強度
    11. 色調
    12. 稀釋葡萄酒的 OD280/OD315 值
    13. 脯氨酸含量
  • 目標變量
    • 葡萄酒的三個類別
    • class_0 有 59 個樣本,class_1 有 71 個樣本,class_2 有 48 個樣本
from sklearn.datasets import load_wine
# 獲取數據集
wine = load_wine()
# 查看數據集
print(wine)
#特征值 和 目標值
x,y = load_wine(return_X_y=True)
# print(x,y)
print(x.shape,y.shape)#(178, 13) (178,)
print("特征名稱:", wine.feature_names)
#['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline']
print("類別名稱:", wine.target_names)
#['class_0' 'class_1' 'class_2']

2. sklearn現實世界數據集

使用 fetch_* 函數下載更大的現實世界數據集,這些數據需要聯網獲取并存儲在本地。

在這里插入圖片描述

20 新聞組數據集
  • 任務類型:文本分類(20 個主題)。
  • 樣本數:約 20,000 條新聞文章。
  • 特征數:文本特征(需通過 TF-IDF 等方法轉換)。
from sklearn.datasets import fetch_20newsgroups
from sklearn import datasets
download_file_path = datasets.get_data_home()
print(datasets.get_data_home())# 獲取20newsgroups數據集
news_data = fetch_20newsgroups(data_home='../src',subset='all')
print(news_data.data[0])

3. 數據集的劃分

scikit-learn 中,將數據集劃分為訓練集(Training Set)和測試集(Test Set)

**sklearn.model_selection.train_test_split(*arrays,**options)

  • array 這里用于接收1到多個"列表、numpy數組、稀疏矩陣或padas中的DataFrame"。
  • 參數
    • test_size 值為0.0到1.0的小數,表示劃分后測試集占的比例
    • random_state 隨機種子,確保結果可復現。
    • strxxxx 分層劃分,填y
    • shuffle:是否在劃分前打亂數據(默認為 True)。

最常用的方法,隨機將數據集劃分為訓練集和測試集。

from sklearn.model_selection import train_test_split
a=[10,20,30,40,50,60,70,80,90,100]
a_train , a_test = train_test_split(a)
# print(a_train,a_test)
#[10, 40, 70, 20, 30, 90, 50] [80, 100, 60]
a=[10,20,30,40,50,60,70,80,90,100]
b=[1,2,3,4,5,6,7,8,9,10]
#指定訓練集和測試集的比例
# a_train , a_test , b_train , b_test = train_test_split(a,b,train_size=5)
# 隨機種子
a_train , a_test , b_train , b_test = train_test_split(a,b,train_size=0.8,random_state=42)
print(a_train,a_test,b_train,b_test)

特征工程

  • 實例化轉換器對象,轉換器類有很多,都是Transformer的子類, 常用的子類有:

    DictVectorizer  	字典特征提取
    CountVectorizer 	文本特征提取
    TfidfVectorizer 	TF-IDF文本特征詞的重要程度特征提取 
    MinMaxScaler 		歸一化
    StandardScaler 		標準化
    VarianceThreshold 	底方差過濾降維
    PCA  				主成分分析降維
    
  • 轉換器對象調用fit_transform()進行轉換, 其中fit用于計算數據,transform進行最終轉換

    fit_transform()可以使用fit()和transform()代替

    data_new = transfer.fit_transform(data)
    可寫成
    transfer.fit(data)
    data_new = transfer.transform(data)
    

1 DictVectorizer - 字典列表特征提取

將字典格式的數據(如 JSON)轉換為數值特征矩陣,特別適合處理混合類型(數值 + 分類)的特征。

創建轉換器對象:

sklearn.feature_extraction.DictVectorizer(sparse=True)

參數:

  • sparse=True返回類型為csr_matrix的稀疏矩陣

  • sparse=False表示返回的是數組,數組可以調用.toarray()方法將稀疏矩陣轉換為數組

轉換器對象:

轉換器對象調用**fit_transform(data)**函數,參數data為一維字典數組或一維字典列表,返回轉化后的矩陣或數組

轉換器對象get_feature_names_out()方法獲取特征名

[示例1] 提取為稀疏矩陣對應的數組

from sklearn.feature_extraction import DictVectorizerdata = [{'city': '北京','temperature': 100,'weather': '晴','wind': '微風','humidity': 80, },{'city': '上海','temperature': 80,'weather': '陰','wind': '小風','humidity': 60},{'city': '廣州','temperature': 70,'weather': '雨','wind': '強風','humidity': 40}           
]
#模型研究x與y的關系前 必須保證xy中全是數字#創建轉換器
#spare = False 輸出結果為矩陣
transfer = DictVectorizer(sparse = False)
data = transfer.fit_transform(data)
print(data)
# 查看轉換后數據的特征名稱
print(transfer.get_feature_names_out())
[[  0.   1.   0.  80. 100.   1.   0.   0.   0.   0.   1.][  1.   0.   0.  60.  80.   0.   1.   0.   1.   0.   0.][  0.   0.   1.  40.  70.   0.   0.   1.   0.   1.   0.]]
['city=上海' 'city=北京' 'city=廣州' 'humidity' 'temperature' 'weather=晴''weather=陰' 'weather=雨' 'wind=小風' 'wind=強風' 'wind=微風']

[示例2 ]提取為稀疏矩陣

from sklearn.feature_extraction import DictVectorizerdata = [{'city': '北京','temperature': 100,'weather': '晴','wind': '微風','humidity': 80, },{'city': '上海','temperature': 80,'weather': '陰','wind': '小風','humidity': 60},{'city': '廣州','temperature': 70,'weather': '雨','wind': '強風','humidity': 40}           
]
#模型研究x與y的關系前 必須保證xy中全是數字#創建轉換器
#sparse = True 返回一個三元組表對象--稀松矩陣
transfer = DictVectorizer(sparse = True)
data = transfer.fit_transform(data)
print(data)
# 查看轉換后數據的特征名稱
print(transfer.get_feature_names_out())
# 稀松矩陣轉換為數組
print(data.toarray())

則輸出為

<Compressed Sparse Row sparse matrix of dtype 'float64'with 15 stored elements and shape (3, 11)>Coords	Values(0, 1)	1.0(0, 3)	80.0(0, 4)	100.0(0, 5)	1.0(0, 10)	1.0(1, 0)	1.0(1, 3)	60.0(1, 4)	80.0(1, 6)	1.0(1, 8)	1.0(2, 2)	1.0(2, 3)	40.0(2, 4)	70.0(2, 7)	1.0(2, 9)	1.0
['city=上海' 'city=北京' 'city=廣州' 'humidity' 'temperature' 'weather=晴''weather=陰' 'weather=雨' 'wind=小風' 'wind=強風' 'wind=微風']
[[  0.   1.   0.  80. 100.   1.   0.   0.   0.   0.   1.][  1.   0.   0.  60.  80.   0.   1.   0.   1.   0.   0.][  0.   0.   1.  40.  70.   0.   0.   1.   0.   1.   0.]]

2 CountVectorizer - 文本特征提取

將文本轉換為詞頻矩陣(Bag of Words 模型),統計每個詞在文檔中出現的次數。

sklearn.feature_extraction.text.CountVectorizer

? 構造函數關鍵字參數stop_words,值為list,表示詞的黑名單(不提取的詞)

fit_transform函數的返回值為稀疏矩陣

英文文本提取

from sklearn.feature_extraction.text import CountVectorizer
data=['hello my name is naci','my age is 18','my dog name is nacy']
counter = CountVectorizer()
# 文本詞頻轉換為矩陣
data = counter.fit_transform(data)
print(data.toarray())
print(counter.get_feature_names_out())
[[0 0 0 1 1 1 1 0 1][1 1 0 0 1 1 0 0 0][0 0 1 0 1 1 0 1 1]]
['18' 'age' 'dog' 'hello' 'is' 'my' 'naci' 'nacy' 'name']

此矩陣應該豎著看,對應所有的詞語,例如‘18’只在第二個文章出現,所以第一列只有第二行為1,以此類推

中文文本提取

from sklearn.feature_extraction.text import CountVectorizer
data=['今天天氣不錯', '今天天氣不錯,但有風']
counter = CountVectorizer()
# 文本詞頻轉換為矩陣
data = counter.fit_transform(data)
print(data.toarray())
print(counter.get_feature_names_out())
[[1 0][1 1]]
['今天天氣不錯' '但有風']

有結果可知,中文沒有空格來分割,所以以逗號分割,一句為一詞

若要統計中文詞組的詞頻,則需要使用jieba分詞,然后通過空格連接起來,再使用ContVectorizer

import jieba
from sklearn.feature_extraction.text import CountVectorizer
arr = jieba.cut('今天天真好')
print(list(arr))def cut_word(words):return ' '.join(jieba.cut(words))
data=['今天天真好','我的貓很可愛']
data2 =[cut_word(i) for i in data]
print(data2)count = CountVectorizer()
# 文本詞頻轉為矩陣
data2 = count.fit_transform(data2)
print(data2.toarray())
['今天', '天真', '好']
['今天 天真 好', '我 的 貓 很 可愛']
[[1 0 1][0 1 0]]

3 TfidfVectorizer TF-IDF - 文本特征詞的重要程度特征提取

將文本轉換為 TF-IDF 值矩陣,評估詞在文檔中的重要性(稀有詞權重更高)。

  • 詞頻(TF):一個詞在文檔中出現的頻率越高,通常對該文檔的代表性越強。
  • 逆文檔頻率(IDF):一個詞在所有文檔中出現的頻率越高(即越常見),其區分度越低,權重也就越低;反之,稀有詞的權重更高。
  1. 詞頻(Term Frequency, TF) 計算公式:
    TF(t,d)=詞?t在文檔?d中出現的次數文檔?d中的總詞數\text{TF}(t,d) = \frac{\text{詞 }t\text{ 在文檔 }d\text{ 中出現的次數}}{\text{文檔 }d\text{ 中的總詞數}} TF(t,d)=文檔?d?中的總詞數?t?在文檔?d?中出現的次數?

    部分實現會使用對數變換:
    TF(t,d)=1+log?(詞?t在文檔?d中出現的次數)\text{TF}(t,d) = 1 + \log(\text{詞 }t\text{ 在文檔 }d\text{ 中出現的次數}) TF(t,d)=1+log(?t?在文檔?d?中出現的次數)

  2. 逆文檔頻率(Inverse Document Frequency, IDF)

    IDF 的計算公式是:

    IDF(t)=log??(總文檔數包含詞t的文檔數+1)IDF(t)=\log?(\dfrac{總文檔數}{包含詞t的文檔數+1})IDF(t)=log?(包含詞t的文檔數+1總文檔數?)

    在 TfidfVectorizer 中,IDF 的默認計算公式是:

    IDF(t)=log??(總文檔數+1包含詞t的文檔數+1)+1IDF(t)=\log?(\dfrac{總文檔數+1}{包含詞t的文檔數+1})+1IDF(t)=log?(包含詞t的文檔數+1總文檔數+1?)+1

  3. 分母中的 +1 是平滑處理,避免出現除以零的情況。

  4. TF-IDF 值 計算公式:
    TF-IDF(t,d)=TF(t,d)×IDF(t)\text{TF-IDF}(t,d) = \text{TF}(t,d) \times \text{IDF}(t) TF-IDF(t,d)=TF(t,d)×IDF(t)

在這里插入圖片描述

sklearn.feature_extraction.text.TfidfVectorizer()

? 構造函數關鍵字參數stop_words,表示詞特征黑名單

fit_transform函數的返回值為稀疏矩陣

import jieba
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizerdef cut_word(words):return ' '.join(jieba.cut(words))data = ["教育學會會長期間堅定支持民辦教育事業!","熱忱關心、扶持民辦學校發展","事業做出重大貢獻!"]
data2 =[cut_word(i) for i in data]
print(data2)transfer = TfidfVectorizer()
data=transfer.fit_transform(data2)
print(data.toarray())
print(transfer.get_feature_names_out())
['教育 學會 會長 期間 堅定 支持 民辦教育 事業 !', '熱忱 關心 、 扶持 民辦學校 發展', '事業 做出 重大貢獻 !']
[[0.27626457 0.36325471 0.         0.         0.         0.363254710.36325471 0.         0.36325471 0.36325471 0.36325471 0.0.36325471 0.         0.        ][0.         0.         0.         0.4472136  0.4472136  0.0.         0.4472136  0.         0.         0.         0.44721360.         0.4472136  0.        ][0.4736296  0.         0.62276601 0.         0.         0.0.         0.         0.         0.         0.         0.0.         0.         0.62276601]]
['事業' '會長' '做出' '關心' '發展' '堅定' '學會' '扶持' '支持' '教育' '期間' '民辦學校' '民辦教育' '熱忱''重大貢獻']
# 手動實現tfidf向量
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from sklearn.preprocessing import normalize
def myTfidfVectorizer(data):# 提取詞頻tansfer = CountVectorizer()data = tansfer.fit_transform(data)TF = data.toarray()#詞頻矩陣IDF = np.log((len(TF)+1)/(1+np.sum(TF!=0,axis=0))+1)'''TF!=0 求出布爾矩陣sum(TF!=0,axis=0) 求出每列非零元素個數-->包含該詞的文檔數len(TF) 矩陣的行數-->文檔數'''tf_idf = TF*IDF #TF-IDF矩陣#對 TF-IDF 矩陣進行 L2 范數歸一化處理tf_idf = normalize(tf_idf,norm='l2')return tf_idfdef cut_word(words):return ' '.join(jieba.cut(words))data = ["教育學會會長期間堅定支持民辦教育事業!","熱忱關心、扶持民辦學校發展","事業做出重大貢獻!"]
data2 =[cut_word(i) for i in data]
res = myTfidfVectorizer(data2)
print(res)

4 無量綱化-預處理

無量綱化(Normalization/Standardization) 是數據預處理的關鍵步驟,用于消除不同特征間量綱和尺度差異的影響,確保模型能夠公平地對待每個特征。

1. MaxAbsScaler

將特征縮放到 [-1,1] 范圍,適合稀疏數據:

對于每個特征x:

在這里插入圖片描述

若要縮放到其他區間,可以使用公式:x=x*(max-min)+min;

sklearn.preprocessing.MinMaxScaler(feature_range)

參數:feature_range=(0,1) 歸一化后的值域,可以自己設定

fit_transform函數歸一化的原始數據類型可以是list、DataFrame和ndarray, 不可以是稀疏矩陣

fit_transform函數的返回值為ndarray

缺點:最大值和最小值容易受到異常點影響,所以魯棒性較差

from sklearn.preprocessing import MinMaxScaler
data=[[1,2,3],[4,5,6],[7,8,9]]
transfer = MinMaxScaler()
data_new = transfer.fit_transform(data)
print(data_new)
[[0.  0.  0. ][0.5 0.5 0.5][1.  1.  1. ]]

若要指定范圍,則設定feature_range

from sklearn.preprocessing import MinMaxScaler
data=[[1,2,3],[4,5,6],[7,8,9]]
transfer = MinMaxScaler(feature_range=(-10,10))
data_new = transfer.fit_transform(data)
print(data_new)
[[-10. -10. -10.][  0.   0.   0.][ 10.  10.  10.]]

2. normalize歸一化

歸一化通過縮放每個樣本向量,使其具有單位范數。

<1> L1歸一化

絕對值相加作為分母,特征值作為分子

公式:
∥x∥1=∑i=1n∣xi∣\|x\|_1 = \sum_{i=1}^n |x_i| x1?=i=1n?xi?

<2> L2歸一化

平方相加作為分母,特征值作為分子

公式:
∥x∥2=∑i=1nxi2\|x\|_2 = \sqrt{\sum_{i=1}^n x_i^2} x2?=i=1n?xi2??
<3> max歸一化

max作為分母,特征值作為分子

sklearn.preprocessing.normalize

  • X:輸入的特征矩陣(二維數組)。
  • norm:范數類型,可選'l1''l2''max'(按最大值縮放)。
  • axis:指定歸一化的方向,axis=0表示按列歸一化,axis=1(默認)表示按行歸一化。
from sklearn.preprocessing import MinMaxScaler, normalize
from sklearn.datasets import load_iris
x,y = load_iris(return_X_y=True)
#axis=1 按列進行歸一化
x = normalize(x,norm = 'l2',axis=1)
print(x)

在這里插入圖片描述

3. StandardScaler

其核心原理是通過減去均值并除以標準差,將特征轉換為均值為 0、方差為 1 的標準正態分布。這有助于消除不同特征間的量綱差異,尤其適用于依賴正態分布假設或梯度優化的算法。

在這里插入圖片描述

z是轉換后的數值,x是原始數據的值,μ是該特征的均值,σ是該特征的 標準差

sklearn.preprocessing.StandardScale

from sklearn.preprocessing import StandardScaler
data=[[1,2,3,5],[4,5,6,8],[7,8,9,11]]transfer = StandardScaler()
data_new = transfer.fit_transform(data)
print(data_new)
print(transfer.mean_)# 均值
print(transfer.var_)# 方差
[[-1.22474487 -1.22474487 -1.22474487 -1.22474487][ 0.          0.          0.          0.        ][ 1.22474487  1.22474487  1.22474487  1.22474487]]
[4. 5. 6. 8.]
[6. 6. 6. 6.]

特征降維

特征降維是指通過減少數據集的特征數量同時保留關鍵信息的過程。高維數據(特征過多)會導致計算復雜度增加、過擬合風險提高,以及所謂的 “維度災難”。降維可以減少數據集維度,同時盡可能保留數據的重要性。

降維可以:

  1. 減少計算開銷
  2. 降低過擬合風險
  3. 可視化數據(降到 2D 或 3D)
  4. 去除噪聲和冗余信息

特征降維技術主要分為兩類:特征選擇特征提取

1 特征選擇

特征選擇是指直接從原始特征中選擇有用的特征,而不該特征本身

低方差過濾特征選擇

如果一個特征的方差很小,說明該特征的取值幾乎沒有變化,提供的信息量有限,可能對模型貢獻不大,可考慮刪除。

方差計算公式為
Var(X)=1n∑i=1n(xi?xˉ)2\text{Var}(X) = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2 Var(X)=n1?i=1n?(xi??xˉ)2
如果一個特征的方差很小,說明這個特征的值在樣本中幾乎相同或者變化不大,包含的信息很少,那這個特征就可以去除

sklearn.feature_selection.VarianceThreshold(threshold=2.0)

  • 設定閾值threshold:任何低于閾值的特征都將被視為低方差特征
  • 過濾:移除所有低方差特征
from sklearn.feature_selection import VarianceThreshold
data = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]
# 創建方差閾值選擇器
transfer = VarianceThreshold(threshold=0.5)
data = transfer.fit_transform(data)
print(data)
[[0][4][1]]

【處理鳶尾花數據集】

from sklearn.datasets import load_iris
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import train_test_splitx,y = load_iris(return_X_y=True)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=22)
# 創建轉換器
transfer = VarianceThreshold(threshold=0.8)
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
print(x_train)
[[1.6][1.5][4. ][4.4]...[4.5][5.9][6. ][1.9][5.6][6.7]]
基于相關系數的特征選擇

相關性:指兩個或多個變量之間存在的關聯關系—— 當一個變量的取值發生變化時,另一個變量的取值也傾向于以某種規律變化。。這種變化不一定是直接引起的,可以間接或者偶然。

  • 相關性不意味著因果關系(“相關非因果”):例如 “冰淇淋銷量” 和 “溺水事故” 正相關,但并非因果,而是共同受 “氣溫” 影響。
  • 相關性有方向和強度:
    • 方向:正相關(一個變量增大,另一個也增大,如 “身高” 與 “體重”)、負相關(一個變量增大,另一個減小,如 “商品價格” 與 “銷量”)。
    • 強度:從 “弱相關” 到 “強相關”(可用數值量化,如相關系數)。

皮爾遜相關系數(Pearson Correlation Coefficient)

衡量線性相關性的指標,取值范圍為[-1, 1]

  • ρ = 1:完全正線性相關;
  • ρ = -1:完全負線性相關;
  • ρ = 0:無線性相關(但可能存在非線性相關)。

對于兩組數據 𝑋={𝑥1,𝑥2,…,𝑥𝑛} 和 𝑌={𝑦1,𝑦2,…,𝑦𝑛},皮爾遜相關系數可以用以下公式計算:

ρ=Cos?(x,y)Dx?Dy=E[(x?Ex)(y?Ey)]Dx?Dy=∑i=1n(x?x~)(y?yˉ)/(n?1)∑i=1n(x?xˉ)2/(n?1)?∑i=1n(y?yˉ)2/(n?1)\rho=\frac{\operatorname{Cos}(x, y)}{\sqrt{D x} \cdot \sqrt{D y}}=\frac{E[(x_-E x)(y-E y)]}{\sqrt{D x} \cdot \sqrt{D y}}=\frac{\sum_{i=1}^{n}(x-\tilde{x})(y-\bar{y}) /(n-1)}{\sqrt{\sum_{i=1}^{n}(x-\bar{x})^{2} /(n-1)} \cdot \sqrt{\sum_{i=1}^{n}(y-\bar{y})^{2} /(n-1)}}ρ=Dx??Dy?Cos(x,y)?=Dx??Dy?E[(x??Ex)(y?Ey)]?=i=1n?(x?xˉ)2/(n?1)??i=1n?(y?yˉ?)2/(n?1)?i=1n?(x?x~)(y?yˉ?)/(n?1)?

|ρ|<0.4為低度相關; 0.4<=|ρ|<0.7為顯著相關; 0.7<=|ρ|<1為高度相關

from scipy.stats import pearsonr
r1 = pearsonr(x,y)
from scipy.stats import pearsonr
x=[5,6,7,2,1,5,12,9,0,4]
y=[2,4,5,4,5,8,9,0,1,3]
p = pearsonr(x,y)
print(p)
PearsonRResult(statistic=np.float64(0.3504442861308587), pvalue=np.float64(0.32081529829352373))
2 主成分分析(PCA)

PCA的核心目標是從原始特征空間中找到一個新的坐標系統,使得數據在新坐標軸上的投影能夠最大程度地保留數據的方差,同時減少數據的維度。

在這里插入圖片描述

  1. 中心化數據:每個特征減去其均值
  2. 計算協方差矩陣:衡量特征間的相關性
  3. 特征值分解:計算協方差矩陣的特征值和特征向量
  4. 選擇主成分:根據主成分的方差等,確定最終保留的主成分個數, 方差大的要留下;若一個特征的多個樣本的值都相同,則方差為0,說明該特征值不能區分樣本
  5. 投影數據:將原始數據投影到選定的特征向量上

from sklearn.decomposition import PCA

  • PCA(n_components=None)
    • 主成分分析
    • n_components:
      • 實參為小數時:表示降維后保留百分之多少的信息
      • 實參為整數時:表示減少到多少特征
from sklearn.decomposition import PCA
import numpy as np
data = np.array([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
pca = PCA(n_components=2)
data_new = pca.fit_transform(data)
print(data_new)
[[-1.28620952e-15  3.82970843e+00][-5.74456265e+00 -1.91485422e+00][ 5.74456265e+00 -1.91485422e+00]]
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
iris = load_iris()
x=iris.data
y=iris.target
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=22)
transfer = PCA(n_components=2)
x_train = transfer.fit_transform(x_train)
#訓練模型
#用模型預測
x_test = transfer.transform(x_test)
print(x_test)
[[-2.36170948  0.64237919][ 2.05485818  0.16275091][ 1.23887735  0.10868042]...[ 0.3864534  -0.37888638][ 1.57303541 -0.53629936][-2.73553694 -0.15148737][ 2.53493848  0.51260491][ 1.91514709  0.1205521 ][ 2.42377809  0.38254852][ 1.41198549 -0.14338675]]

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

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

相關文章

n8n】n8n的基礎概念

以下是為初學者整理的 n8n 基本概念總結&#xff0c;幫助快速理解核心功能和使用邏輯&#xff1a;1. 工作流&#xff08;Workflow&#xff09;核心單元&#xff1a;n8n的一切操作基于工作流&#xff0c;代表一個自動化流程。組成&#xff1a;由多個節點&#xff08;Nodes&#…

機器學習基礎-matplotlib

一、相關知識點二、plotfrom pylab import mpl # 設置顯示中文字體 mpl.rcParams["font.sans-serif"] ["SimHei"] # 設置正常顯示符號 mpl.rcParams["axes.unicode_minus"] False #%%#%% import matplotlib.pyplot as plt import random# 畫出…

spring-ai-alibaba 學習(十九)——graph之條件邊、并行節點、子圖節點

前面了解了基礎的概念及流程&#xff0c;以及一些參數類下面了解一些特殊的邊和節點條件邊常見的流程圖可能長這個樣子&#xff1a;其中菱形的為條件節點&#xff08;或者叫判定節點&#xff09;&#xff0c;但是在spring-ai-alibaba-graph中&#xff0c;并沒有條件節點在sprin…

深入淺出設計模式——創建型模式之原型模式 Prototype

文章目錄原型模式簡介原型模式結構關于克隆方法&#xff1a;淺拷貝/深拷貝原型模式代碼實例定義原型類和克隆方法客戶端使用代碼示例示例一&#xff1a;淺拷貝示例二&#xff1a;深拷貝原型模式總結開閉原則代碼倉庫原型模式&#xff1a;用原型實例指定創建對象的種類&#xff…

.NET 10 中的新增功能系列文章3—— .NET MAUI 中的新增功能

.NET 10 預覽版 6 中的 .NET MAUI.NET 10 預覽版 5 中的.NET MAUI.NET 10 預覽版 4 中的 .NET MAUI.NET 10 預覽版 3 中的 .NET MAUI.NET 10 預覽版 2 中的 .NET MAUI.NET 10 預覽版 1 中的 .NET MAUI 一、MediaPicker 增強功能&#xff08;預覽版6&#xff09; .NET 10 預覽…

MT Photos圖庫部署詳解:Docker搭建+貝銳蒲公英異地組網遠程訪問

如今&#xff0c;私有化部署輕量級圖床/圖庫系統&#xff0c;已經成為越來越多用戶的高頻需求。而MT Photos&#xff0c;正是一款非常適合在Docker環境下運行的自托管圖床/圖庫系統。MT Photos基于Node.js與Vue構建&#xff0c;界面簡潔美觀&#xff0c;支持多用戶權限管理、多…

解決dbeaver連接不上oceanbase數據庫的問題

解決dbeaver連接不上oceanbase數據庫的問題 問題&#xff1a; 使用dbeaver連接oceanbase數據庫報錯如下&#xff1a; ORA-00900: You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘dat…

Kafka——請求是怎么被處理的?

引言在分布式消息系統中&#xff0c;請求處理機制是連接客戶端與服務端的"神經中樞"。無論是生產者發送消息、消費者拉取數據&#xff0c;還是集群內部的元數據同步&#xff0c;都依賴于高效的請求處理流程。Apache Kafka作為高性能消息隊列的代表&#xff0c;其請求…

區塊鏈技術如何確保智能合約的安全性和可靠性?

智能合約作為區塊鏈上自動執行的可編程協議&#xff0c;其安全性和可靠性直接決定了區塊鏈應用的信任基礎。區塊鏈通過底層技術架構、密碼學工具和機制設計的多重保障&#xff0c;構建了智能合約的安全防線。以下從技術原理、核心機制和實踐保障三個維度展開分析&#xff1a;一…

2020 年 NOI 最后一題題解

問題描述2020 年 NOI 最后一題是一道結合圖論、動態規劃與狀態壓縮的綜合性算法題&#xff0c;題目圍繞 "疫情期間的物資配送" 展開&#xff0c;具體要求如下&#xff1a;給定一個有向圖 G (V, E)&#xff0c;其中節點代表城市&#xff0c;邊代表連接城市的道路。每個…

加密與安全

目錄 一、URL編碼&#xff1a; 二、Base64編碼&#xff1a; 三、哈希算法&#xff1a; 四、Hmac算法&#xff1a; 五、對稱加密算法&#xff1a; 一、URL編碼&#xff1a; URL編碼是瀏覽器發送數據給服務器時使用的編碼&#xff0c;它通常附加在URL的參數部分。之所以需要…

EasyExcel 公式計算大全

EasyExcel 是基于 Apache POI 的封裝&#xff0c;主要專注于簡化 Excel 的讀寫操作&#xff0c;對于公式計算的支持相對有限。以下是 EasyExcel 中處理公式計算的全面指南&#xff1a;1. 基本公式寫入1.1 寫入簡單公式Data public class FormulaData {ExcelProperty("數值…

2025年AI+數模競賽培訓意見征集-最后一輪

在過去幾天的“AI時代下2025年數模競賽培訓課程需求調研緊急征集”我們收到了大量老師、學生的反饋。我們通過大家的實際需求&#xff0c;編寫了下述2025年AI時代下最新的數學建模競賽教學課程課程表&#xff0c;具體授課內容以及相關課件、支撐材料都將會免費發布&#xff0c;…

Qwen2 RotaryEmbedding 位置編碼僅僅是第一層有嗎

Qwen2 RotaryEmbedding 位置編碼僅僅是第一層有嗎,還是全部層都有 Qwen2 模型中的 Rotary Embedding(旋轉位置編碼)是應用于所有 Transformer 層 的,而非僅第一層。 1. Transformer 架構的核心邏輯 Qwen2 基于 Decoder-only Transformer 架構,而位置編碼(如 Rotary Emb…

CNN卷積神經網絡之LeNet和AlexNet經典網絡模型(三)

CNN卷積神經網絡之LeNet和AlexNet經典網絡模型&#xff08;三&#xff09; 文章目錄CNN卷積神經網絡之LeNet和AlexNet經典網絡模型&#xff08;三&#xff09;深度學習兩大經典 CNN 模型速覽1. LeNet-5&#xff1a;CNN 的開山之作&#xff08;1998&#xff09;2. AlexNet&#…

江協科技STM32 12-2 BKP備份寄存器RTC實時時鐘

這一節我們要講的主要內容是RTC實時時鐘&#xff0c;實時時鐘本質上是一個定時器&#xff0c;但是這個定時器是專門用來產生年月日時分秒&#xff0c;這種日期和時間信息的。所以學會了STM32的RTC就可以在STM32內部擁有一個獨立運行的鐘表。想要記錄或讀取日期和時間&#xff0…

【10】大恒相機SDK C++開發 ——對相機采集的原圖像數據IFrameData裁剪ROI 實時顯示在pictureBox中,3種方法實現(效率不同)

文章目錄1 在回調函數中實現2 獨立封裝調用2.1 獲取圖像寬、高、pBuffer、channel2.2 內存圖像數據截取ROI并顯示2.3 回調函數調用3 for循環嵌套 方法24 for循環嵌套 方法35 按行復制數據提高效率&#xff0c;但很耗內存6 unsafe代碼 解釋及注意事項 看我另一篇文章7 ConvertTo…

ubuntu22.04系統入門 linux入門(二) 簡單命令 多實踐以及相關文件管理命令

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 之所以推薦給大家使用&#xff0c;是因為上面的云主機目前是免費使用的…

分布式ID方案(標記)

一、參考文章-標記 分布式ID方案有哪些&#xff1f;雪花算法如何搞定時鐘回撥和動態機器ID&#xff1f; 二、應用 1.百度 uid-generator github項目地址 原理參考 2.百度 uid-generator 擴展應用 燈官網 燈 項目代碼 lamp-util 單元模塊 lamp-util 單元模塊子模塊 lamp-…

std::map 加鎖

在并發環境下使用std::map&#xff0c;必須采取同步措施。 在并發環境下對 std::map 進行不加鎖的讀寫操作會導致嚴重的線程安全問題&#xff0c;主要會產生以下幾種問題&#xff1a; ?? 主要風險與后果數據競爭&#xff08;Data Race&#xff09; 當多個線程同時修改同一個鍵…