日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】特征工程

發(fā)布時(shí)間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】特征工程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 數(shù)據(jù)集

    • 可用數(shù)據(jù)集

    • sklearn數(shù)據(jù)集

  • 特征提取

    • 字典

    • 文本

  • 特征預(yù)處理

    • 無(wú)量綱化
      • 歸一化
      • 標(biāo)準(zhǔn)化
  • 特征降維

    • 特征選擇

    • 主成分分析(PCA降維)

數(shù)據(jù)集

下面列舉了一些示例來(lái)說(shuō)明哪些內(nèi)容能算作數(shù)據(jù)集:

  • 包含某些數(shù)據(jù)的表格或 CSV 文件

  • 組織有序的表格集合

  • 采用專有格式的文件,其中包含數(shù)據(jù)

  • 可共同構(gòu)成某個(gè)有意義數(shù)據(jù)集的一組文件

  • 包含其他格式的數(shù)據(jù)的結(jié)構(gòu)化對(duì)象,您可能希望將其加載到特殊工具中進(jìn)行處理

  • 捕獲數(shù)據(jù)的圖像

  • 與機(jī)器學(xué)習(xí)相關(guān)的文件,如經(jīng)過(guò)訓(xùn)練的參數(shù)或神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)定義

  • 任何看來(lái)像數(shù)據(jù)集的內(nèi)容

sklearn是一個(gè)Python第三方提供的非常強(qiáng)力的機(jī)器學(xué)習(xí)庫(kù),它包含了從數(shù)據(jù)預(yù)處理到訓(xùn)練模型的各個(gè)方面。在實(shí)戰(zhàn)使用scikit-learn中可以極大的節(jié)省我們編寫代碼的時(shí)間以及減少我們的代碼量,使我們有更多的精力去分析數(shù)據(jù)分布,調(diào)整模型和修改超參。(sklearn為包名)

特征提取

目標(biāo)

  • 應(yīng)用DictVectorizer實(shí)現(xiàn)對(duì)類別特征進(jìn)行數(shù)值化、離散化

  • 應(yīng)用CountVectorizer實(shí)現(xiàn)對(duì)文本特征進(jìn)行數(shù)值化

  • 應(yīng)用TfidfVectorizer實(shí)現(xiàn)對(duì)文本特征進(jìn)行數(shù)值化

  • 說(shuō)出兩種文本特征提取的方式區(qū)別

定義

特征提取是將任意數(shù)據(jù)(如文本或圖像)轉(zhuǎn)換為可用于機(jī)器學(xué)習(xí)的數(shù)字特征

注:特征值化是為了計(jì)算機(jī)更好的去理解數(shù)據(jù)

  • 字典特征提取(特征離散化)

  • 文本特征提取

  • 圖像特征提取(深度學(xué)習(xí))

特征提取API

sklearn.feature_extraction

字典特征提取

作用:對(duì)字典數(shù)據(jù)進(jìn)行特征值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器,返回值:返回sparse矩陣
    • DictVectorizer.inverse_transform(X) X:array數(shù)組或者sparse矩陣 返回值:轉(zhuǎn)換之前數(shù)據(jù)格式
    • DictVectorizer.get_feature_names() 返回類別名稱

應(yīng)用

對(duì)以下數(shù)據(jù)進(jìn)行特征提取

data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]

流程分析

  • 實(shí)例化類DictVectorizer

  • 調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換(注意返回格式)

def dict_demo():"""字典特征值提取:return:"""data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]# 1. 實(shí)例化一個(gè)轉(zhuǎn)換器 默認(rèn)返回 sparse矩陣 將非0值按位置表示出來(lái) 以節(jié)省內(nèi)存 提高加載效率transfer = DictVectorizer(sparse=False)# 應(yīng)用場(chǎng)景:數(shù)據(jù)集中類別特征值較多;將數(shù)據(jù)集的特征-》字典類型;DictVectorizer轉(zhuǎn)換;本身拿到的就是字典# 2. 調(diào)用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new)print("特征名字:\n", transfer.get_feature_names())return None

注意觀察沒(méi)有加上sparse=False參數(shù)的結(jié)果

這個(gè)結(jié)果并不是想要看到的,所以加上參數(shù),得到想要的結(jié)果,在這里把這個(gè)處理數(shù)據(jù)的技巧用專業(yè)的稱呼"one-hot"編碼。

總結(jié)

對(duì)于特征當(dāng)中存在類別信息的都會(huì)做one-hot編碼處理

文本特征提取

作用:對(duì)文本數(shù)據(jù)進(jìn)行特征值化

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

    • 返回詞頻矩陣
  • CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代對(duì)象 返回值:返回sparse矩陣

  • CountVectorizer.inverse_transform(X) X:array數(shù)組或者sparse矩陣 返回值:轉(zhuǎn)換之前數(shù)據(jù)格

  • CountVectorizer.get_feature_names() 返回值:單詞列表

  • sklearn.feature_extraction.text.TfidfVectorizer

應(yīng)用

對(duì)以下數(shù)據(jù)進(jìn)行特征提取

data = ["life is short, i like python", "life is too long i dislike python"]

流程分析

  • 實(shí)例化類CountVectorizer

  • 調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換 (注意返回格式,利用toarray()進(jìn)行sparse矩陣轉(zhuǎn)換array數(shù)組)

def count_demo():"""文本特征值抽取:return:"""data = ["life is short, i like python", "life is too long i dislike python"]# 1、實(shí)例化一個(gè)轉(zhuǎn)換器類transfer = CountVectorizer()# 演示停用詞# transfer = CountVectorizer(stop_words=["is", "too"])data_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names())# 2、調(diào)用fit_transformreturn None

問(wèn)題:如果我們將數(shù)據(jù)替換成中文?

發(fā)現(xiàn)英文默認(rèn)是以空格分開(kāi)的。其實(shí)就達(dá)到了一個(gè)分詞的效果,所以我們要對(duì)中文進(jìn)行分詞處理

下面代碼需要提前把文本做好空格間隙

def count_chinese_demo():"""中文文本特征值抽取:return:"""data = ["我 愛(ài) 北京 天安門", "天安門 上 太陽(yáng) 升"]data2 = ["我愛(ài)北京天安門", "天安門上太陽(yáng)升"]# 1、實(shí)例化一個(gè)轉(zhuǎn)換器類transfer = CountVectorizer()data_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names())# 2、調(diào)用fit_transformreturn None

更好的處理方式見(jiàn)下方案

jieba分詞處理

  • jieba.cut()
    • 返回詞語(yǔ)組成的生成器

需要安裝下jieba庫(kù)

pip install jieba

案例分析

data = ["在過(guò)去兩個(gè)月里,我和60多位小伙伴進(jìn)行了1對(duì)1的一小時(shí)溝通;","TA絕大多數(shù)是想要嘗試副業(yè)變現(xiàn)的朋友。","從一線城市到三線城市,從寶媽到職場(chǎng)人,從職場(chǎng)到體制內(nèi)。"]

分析

  • 準(zhǔn)備句子,利用jieba.cut進(jìn)行分詞

  • 實(shí)例化CountVectorizer

  • 將分詞結(jié)果變成字符串當(dāng)作fit_transform的輸入值

def count_word(text):"""進(jìn)行中文分詞 我愛(ài)北京天安門-》我 愛(ài) 北京 天安門:param text::return:"""a = " ".join(list(jieba.cut(text)))print(a)return adef count_chinese_demo2():"""中文文本特征值抽取 自動(dòng)分詞:return:"""data = ["在過(guò)去兩個(gè)月里,我和60多位小伙伴進(jìn)行了1對(duì)1的一小時(shí)溝通;","TA絕大多數(shù)是想要嘗試副業(yè)變現(xiàn)的朋友。","從一線城市到三線城市,從寶媽到職場(chǎng)人,從職場(chǎng)到體制內(nèi)。"]# 1、實(shí)例化一個(gè)轉(zhuǎn)換器類transfer = CountVectorizer(stop_words=["從寶媽"])data_new = transfer.fit_transform(count_word(item) for item in data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names())# 2、調(diào)用fit_transformreturn None

問(wèn)題:該如何處理某個(gè)詞或短語(yǔ)在多篇文章中出現(xiàn)的次數(shù)高這種情況?

Tf-idf文本特征提取

TF-IDF的主要思想是:如果某個(gè)詞或短語(yǔ)在一篇文章中出現(xiàn)的概率高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語(yǔ)具有很好的類別區(qū)分能力,適合用來(lái)分類。

TF-IDF作用:用以評(píng)估一字詞對(duì)于一個(gè)文件集或一個(gè)語(yǔ)料庫(kù)中的其中一份文件的重要程度。

公式

詞頻(term frequency,tf)指的是某一個(gè)給定的詞語(yǔ)在該文件中出現(xiàn)的頻率

逆向文檔頻率(inverse document frequency,idf)是一個(gè)詞語(yǔ)普遍重要性的度量。某一特定詞語(yǔ)的idf,可以由總文件數(shù)目除以包含該詞語(yǔ)之
文件的數(shù)目,再將得到的商取以10為底的對(duì)數(shù)得到

最終得出結(jié)果可以理解為重要程度。

注:假如一篇文件的總詞語(yǔ)數(shù)是100個(gè),而詞語(yǔ)"非常"出現(xiàn)了5次,那么"非常"一詞在該文件中的詞頻就是5/100=0.05。而計(jì)算文件頻率(IDF)的方法是以文件集的文件總數(shù),除以出現(xiàn)"非常"一詞的文件數(shù)。所以,如果"非常"一詞在1,000份文件出現(xiàn)過(guò),而文件總數(shù)是10,000,000份的話,其逆向文件頻率就是lg(10,000,000 / 1,0000)=3。最后"非常"對(duì)于這篇文檔的tf-idf的分?jǐn)?shù)為0.05 * 3=0.15

案例

def tfidf_demo():"""用TF-IDF方法進(jìn)行文本特征值抽取:return:"""data = ["在過(guò)去兩個(gè)月里,我和60多位小伙伴進(jìn)行了1對(duì)1的一小時(shí)溝通;","TA絕大多數(shù)是想要嘗試副業(yè)變現(xiàn)的朋友。","從一線城市到三線城市,從寶媽到職場(chǎng)人,從職場(chǎng)到體制內(nèi)。"]transfer = TfidfVectorizer(stop_words=["從寶媽"])data_new = transfer.fit_transform(count_word(item) for item in data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names())return None

Tf-idf的重要性

分類機(jī)器學(xué)習(xí)算法進(jìn)行文章分類中前期數(shù)據(jù)處理方式

特征預(yù)處理

目標(biāo)

  • 了解數(shù)值型數(shù)據(jù)、類別型數(shù)據(jù)特點(diǎn)

  • 應(yīng)用MinMaxScaler實(shí)現(xiàn)對(duì)特征數(shù)據(jù)進(jìn)行歸一化

  • 應(yīng)用StandardScaler實(shí)現(xiàn)對(duì)特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化

什么是特征預(yù)處理

特征預(yù)處理:通過(guò)一些轉(zhuǎn)換函數(shù)將特征數(shù)據(jù)轉(zhuǎn)換成更加適合算法模型的特征數(shù)據(jù)過(guò)程


可以通過(guò)上面那張圖來(lái)理解

包含內(nèi)容

數(shù)值型數(shù)據(jù)的無(wú)量綱化:

  • 歸一化

  • 標(biāo)準(zhǔn)化

特征預(yù)處理API

sklearn.preprocessing

為什么我們要進(jìn)行歸一化/標(biāo)準(zhǔn)化?

特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個(gè)數(shù)量級(jí),容易影響(支配)目標(biāo)結(jié)果,使得一些算法無(wú)法學(xué)習(xí)到其它的特征

我們需要用到一些方法進(jìn)行無(wú)量綱化,使不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格

歸一化

定義

通過(guò)對(duì)原始數(shù)據(jù)進(jìn)行變換把數(shù)據(jù)映射到(默認(rèn)為[0,1])之間

公式

作用于每一列,max為一列的最大值,min為一列的最小值,那么X’’為最終結(jié)果,mx,mi分別為指定區(qū)間值默認(rèn)mx為1、mi為0

API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
    • MinMaxScalar.fit_transform(X)
      • X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
    • 返回值:轉(zhuǎn)換后的形狀相同的array

數(shù)據(jù)計(jì)算

我們對(duì)以下數(shù)據(jù)進(jìn)行運(yùn)算,在dating.txt中。保存的就是之前的約會(huì)對(duì)象數(shù)據(jù)

milage,Liters,Consumtime,target 40920,8.326976,0.953952,3 14488,7.153469,1.673904,2 26052,1.441871,0.805124,1 75136,13.147394,0.428964,1 38344,1.669788,0.134296,1

分析

  • 實(shí)例化MinMaxScalar

  • 通過(guò)fit_transform轉(zhuǎn)換

def minmax_demo():"""歸一化:return:"""# 1、獲取數(shù)據(jù)data = pd.read_csv("dating.txt")data = data.iloc[:, :3]print(data)# 2、實(shí)例化一個(gè)轉(zhuǎn)換器類transform = MinMaxScaler()# transform = MinMaxScaler(feature_range=[2, 3])# 3、調(diào)用fit_transformdata_new = transform.fit_transform(data)print("data_new:\n", data_new)return None

歸一化總結(jié)

注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點(diǎn)影響,所以這種方法魯棒性較差,只適合傳統(tǒng)精確小數(shù)據(jù)場(chǎng)景。

標(biāo)準(zhǔn)化

定義

通過(guò)對(duì)原始數(shù)據(jù)進(jìn)行變換把數(shù)據(jù)變換到均值為0,標(biāo)準(zhǔn)差為1范圍內(nèi)

公式

作用于每一列,mean為平均值,σ為標(biāo)準(zhǔn)差

所以回到剛才異常點(diǎn)的地方,我們?cè)賮?lái)看看標(biāo)準(zhǔn)化

  • 對(duì)于歸一化來(lái)說(shuō):如果出現(xiàn)異常點(diǎn),影響了最大值和最小值,那么結(jié)果顯然會(huì)發(fā)生改變

  • 對(duì)于標(biāo)準(zhǔn)化來(lái)說(shuō):如果出現(xiàn)異常點(diǎn),由于具有一定數(shù)據(jù)量,少量的異常點(diǎn)

  • 對(duì)于平均值的影響并不大,從而方差改變較小。

API

  • sklearn.preprocessing.StandardScaler( )
    • 處理之后每列來(lái)說(shuō)所有數(shù)據(jù)都聚集在均值0附近標(biāo)準(zhǔn)差差為1
    • StandardScaler.fit_transform(X)
      • X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
    • 返回值:轉(zhuǎn)換后的形狀相同的array

數(shù)據(jù)計(jì)算

同樣對(duì)上面的數(shù)據(jù)進(jìn)行處理

[[90,2,10,40], [60,4,15,45], [75,3,13,46]]

分析

  • 實(shí)例化StandardScaler

  • 通過(guò)fit_transform轉(zhuǎn)換

def stand_demo():"""進(jìn)行標(biāo)準(zhǔn)化在已有樣本足夠多的情況下,適合現(xiàn)在嘈雜大數(shù)據(jù)場(chǎng)景:return:"""# 1、獲取數(shù)據(jù)data = pd.read_csv("dating.txt")data = data.iloc[:, :3]print(data)# 2、實(shí)例化一個(gè)轉(zhuǎn)換器類transform = StandardScaler()# 3、調(diào)用fit_transformdata_new = transform.fit_transform(data)print("data_new:\n", data_new)return None

標(biāo)準(zhǔn)化總結(jié)

在已有樣本足夠多的情況下比較穩(wěn)定,適合現(xiàn)代嘈雜大數(shù)據(jù)場(chǎng)景。

特征降維

目標(biāo)

  • 知道特征選擇的嵌入式、過(guò)濾式以及包裹氏三種方式

  • 應(yīng)用VarianceThreshold實(shí)現(xiàn)刪除低方差特征

  • 了解相關(guān)系數(shù)的特點(diǎn)和計(jì)算

  • 應(yīng)用相關(guān)性系數(shù)實(shí)現(xiàn)特征選擇

降維

降維是指在某些限定條件下,降低隨機(jī)變量(特征)個(gè)數(shù),得到一組“不相關(guān)”主變量的過(guò)程

  • 降低隨機(jī)變量的個(gè)數(shù)

  • 相關(guān)特征(correlated feature):相對(duì)濕度與降雨量之間的相關(guān)等等

正是因?yàn)樵谶M(jìn)行訓(xùn)練的時(shí)候,我們都是使用特征進(jìn)行學(xué)習(xí)。如果特征本身存在問(wèn)題或者特征之間相關(guān)性較強(qiáng),對(duì)于算法學(xué)習(xí)預(yù)測(cè)會(huì)影響較大

降維的兩種方式

  • 特征選擇

  • 主成分分析(可以理解一種特征提取的方式)

特征選擇

什么是特征選擇

定義: 數(shù)據(jù)中包含冗余或無(wú)關(guān)變量(或稱特征、屬性、指標(biāo)等),旨在從原有特征中找出主要特征。

方法:

  • Filter(過(guò)濾式):主要探究特征本身特點(diǎn)、特征與特征和目標(biāo)值之間關(guān)聯(lián)

    • 方差選擇法:低方差特征過(guò)濾
    • 相關(guān)系數(shù)
  • Embedded (嵌入式):算法自動(dòng)選擇特征(特征與目標(biāo)值之間的關(guān)聯(lián))

    • 決策樹(shù):信息熵、信息增益
    • 正則化:L1、L2
    • 深度學(xué)習(xí):卷積等
  • Wrapper (包裹式)

模塊

sklearn.feature_selection

過(guò)濾式

低方差特征過(guò)濾

刪除低方差的一些特征,前面講過(guò)方差的意義。再結(jié)合方差的大小來(lái)考慮這個(gè)方式的角度。

  • 特征方差小:某個(gè)特征大多樣本的值比較相近

  • 特征方差大:某個(gè)特征很多樣本的值都有差別

API

  • sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
    • 刪除所有低方差特征
    • Variance.fit_transform(X)
      • X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
      • 返回值:訓(xùn)練集差異低于threshold的特征將被刪除。默認(rèn)值是保留所有非零方差特征,即刪除所有樣本中具有相同值的特征。

數(shù)據(jù)計(jì)算

我們對(duì)某些股票的指標(biāo)特征之間進(jìn)行一個(gè)篩選

一共這些特征

pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense index,pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense,date,return 0,000001.XSHE,5.9572,1.1818,85252550922.0,0.8008,14.9403,1211444855670.0,2.01,20701401000.0,10882540000.0,2012-01-31,0.027657228229937388 1,000002.XSHE,7.0289,1.588,84113358168.0,1.6463,7.8656,300252061695.0,0.326,29308369223.2,23783476901.2,2012-01-31,0.08235182370820669 2,000008.XSHE,-262.7461,7.0003,517045520.0,-0.5678,-0.5943,770517752.56,-0.006,11679829.03,12030080.04,2012-01-31,0.09978900335112327 3,000060.XSHE,16.476,3.7146,19680455995.0,5.6036,14.617,28009159184.6,0.35,9189386877.65,7935542726.05,2012-01-31,0.12159482758620697 4,000069.XSHE,12.5878,2.5616,41727214853.0,2.8729,10.9097,81247380359.0,0.271,8951453490.28,7091397989.13,2012-01-31,-0.0026808154146886697 def variance_demo():"""過(guò)濾低方差特征:return:"""# 1、獲取數(shù)據(jù)data = pd.read_csv("factor_returns.csv")data = data.iloc[:, 1: -2]print(data)# 2、實(shí)例化一個(gè)轉(zhuǎn)換器transfer = VarianceThreshold(threshold=5)# 3、調(diào)用fit_transformdata_new = transfer.fit_transform(data)print("data_new", data_new, data_new.shape)return Noneif __name__ == '__main__':# 低方差特征過(guò)濾variance_demo()

相關(guān)系數(shù)

皮爾遜相關(guān)系數(shù)(Pearson Correlation Coefficient): 反映變量之間相關(guān)關(guān)系密切程度的統(tǒng)計(jì)指標(biāo)

公式計(jì)算案例(了解,不用記憶)

公式:

比如說(shuō)我們計(jì)算年廣告費(fèi)投入與月均銷售額

= 0.9942

所以我們最終得出結(jié)論是廣告投入費(fèi)與月平均銷售額之間有高度的正相關(guān)關(guān)系。

特點(diǎn)

相關(guān)系數(shù)的值介于–1與+1之間,即–1≤ r ≤+1。其性質(zhì)如下:

  • 當(dāng)r>0時(shí),表示兩變量正相關(guān),r<0時(shí),兩變量為負(fù)相關(guān)

  • 當(dāng)|r|=1時(shí),表示兩變量為完全相關(guān),當(dāng)r=0時(shí),表示兩變量間無(wú)相關(guān)關(guān)系

  • 當(dāng)0<|r|<1時(shí),表示兩變量存在一定程度的相關(guān)。且|r|越接近1,兩變量間線性關(guān)系越密切;|r|越接近于0,表示兩變量的線性相關(guān)越弱

一般可按三級(jí)劃分:|r|<0.4為低度相關(guān);0.4≤|r|<0.7為顯著性相關(guān);0.7≤|r|<1為高度線性相關(guān)

這個(gè)符號(hào):|r|為r的絕對(duì)值, |-5| = 5

API

from scipy.stats import pearsonr x : (N,) array_like y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)

主成分分析

目標(biāo)

  • 應(yīng)用PCA實(shí)現(xiàn)特征的降維

  • 應(yīng)用:用戶與物品類別之間主成分分析

什么是主成分分析(PCA)

定義:高維數(shù)據(jù)轉(zhuǎn)化為低維數(shù)據(jù)的過(guò)程,在此過(guò)程中可能會(huì)舍棄原有數(shù)據(jù)、創(chuàng)造新的變量

作用:是數(shù)據(jù)維數(shù)壓縮,盡可能降低原數(shù)據(jù)的維數(shù)(復(fù)雜度),損失少量信息。

應(yīng)用:回歸分析或者聚類分析當(dāng)中

那么更好的理解這個(gè)過(guò)程呢?我們來(lái)看一張圖

API

  • sklearn.decomposition.PCA(n_components=None)
    • 將數(shù)據(jù)分解為較低維數(shù)空間
    • n_components:
      • 小數(shù):表示保留百分之多少的信息
      • 整數(shù):減少到多少特征
    • PCA.fit_transform(X) X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
    • 返回值:轉(zhuǎn)換后指定維度的array

數(shù)據(jù)計(jì)算

[[2,8,4,5], [6,3,0,8], [5,4,9,1]] def pca():"""主成分分析進(jìn)行降維:return:"""# 信息保留70%pca = PCA(n_components=0.7)data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])print(data)return None

案例:探究用戶對(duì)物品類別的喜好細(xì)分降維

數(shù)據(jù)

  • order_products__prior.csv:訂單與商品信息

    • 字段:order_id, product_id, add_to_cart_order, reordered
  • products.csv:商品信息

    • 字段:product_id, product_name, aisle_id, department_id
  • orders.csv:用戶的訂單信息

    • 字段:order_id,user_id,eval_set,order_number,….
  • aisles.csv:商品所屬具體物品類別

    • 字段: aisle_id, aisle

分析

  • 合并表,使得user_id與aisle在一張表當(dāng)中

  • 進(jìn)行交叉表變換

  • 進(jìn)行降維

def pca_case_study():"""主成分分析案例:return: """# 去讀四張表的數(shù)據(jù)prior = pd.read_csv("./instacart/order_products__prior.csv")products = pd.read_csv("./instacart/products.csv")orders = pd.read_csv("./instacart/orders.csv")aisles = pd.read_csv("./instacart/aisles.csv")print(prior)# 合并四張表mt = pd.merge(prior, products, on=['product_id', 'product_id'])mt1 = pd.merge(mt, orders, on=['order_id', 'order_id'])mt2 = pd.merge(mt1, aisles, on=['aisle_id', 'aisle_id'])# pd.crosstab 統(tǒng)計(jì)用戶與物品之間的次數(shù)關(guān)系(統(tǒng)計(jì)次數(shù))cross = pd.crosstab(mt2['user_id'], mt2['aisle'])# PCA進(jìn)行主成分分析pc = PCA(n_components=0.95)data_new = pc.fit_transform(cross)print("data_new:\n", data_new.shape)return None

總結(jié)

以上是生活随笔為你收集整理的【机器学习】特征工程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。