【机器学习】特征工程
目錄
-
數據集
-
可用數據集
-
sklearn數據集
-
-
特征提取
-
字典
-
文本
-
-
特征預處理
- 無量綱化
- 歸一化
- 標準化
- 無量綱化
-
特征降維
-
特征選擇
-
主成分分析(PCA降維)
-
數據集
下面列舉了一些示例來說明哪些內容能算作數據集:
-
包含某些數據的表格或 CSV 文件
-
組織有序的表格集合
-
采用專有格式的文件,其中包含數據
-
可共同構成某個有意義數據集的一組文件
-
包含其他格式的數據的結構化對象,您可能希望將其加載到特殊工具中進行處理
-
捕獲數據的圖像
-
與機器學習相關的文件,如經過訓練的參數或神經網絡結構定義
-
任何看來像數據集的內容
sklearn是一個Python第三方提供的非常強力的機器學習庫,它包含了從數據預處理到訓練模型的各個方面。在實戰使用scikit-learn中可以極大的節省我們編寫代碼的時間以及減少我們的代碼量,使我們有更多的精力去分析數據分布,調整模型和修改超參。(sklearn為包名)
特征提取
目標
-
應用DictVectorizer實現對類別特征進行數值化、離散化
-
應用CountVectorizer實現對文本特征進行數值化
-
應用TfidfVectorizer實現對文本特征進行數值化
-
說出兩種文本特征提取的方式區別
定義
特征提取是將任意數據(如文本或圖像)轉換為可用于機器學習的數字特征
注:特征值化是為了計算機更好的去理解數據
-
字典特征提取(特征離散化)
-
文本特征提取
-
圖像特征提取(深度學習)
特征提取API
sklearn.feature_extraction
字典特征提取
作用:對字典數據進行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器,返回值:返回sparse矩陣
- DictVectorizer.inverse_transform(X) X:array數組或者sparse矩陣 返回值:轉換之前數據格式
- DictVectorizer.get_feature_names() 返回類別名稱
應用
對以下數據進行特征提取
data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]流程分析
-
實例化類DictVectorizer
-
調用fit_transform方法輸入數據并轉換(注意返回格式)
注意觀察沒有加上sparse=False參數的結果
這個結果并不是想要看到的,所以加上參數,得到想要的結果,在這里把這個處理數據的技巧用專業的稱呼"one-hot"編碼。
總結
對于特征當中存在類別信息的都會做one-hot編碼處理
文本特征提取
作用:對文本數據進行特征值化
-
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- 返回詞頻矩陣
-
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代對象 返回值:返回sparse矩陣
-
CountVectorizer.inverse_transform(X) X:array數組或者sparse矩陣 返回值:轉換之前數據格
-
CountVectorizer.get_feature_names() 返回值:單詞列表
-
sklearn.feature_extraction.text.TfidfVectorizer
應用
對以下數據進行特征提取
data = ["life is short, i like python", "life is too long i dislike python"]流程分析
-
實例化類CountVectorizer
-
調用fit_transform方法輸入數據并轉換 (注意返回格式,利用toarray()進行sparse矩陣轉換array數組)
問題:如果我們將數據替換成中文?
發現英文默認是以空格分開的。其實就達到了一個分詞的效果,所以我們要對中文進行分詞處理
下面代碼需要提前把文本做好空格間隙
def count_chinese_demo():"""中文文本特征值抽取:return:"""data = ["我 愛 北京 天安門", "天安門 上 太陽 升"]data2 = ["我愛北京天安門", "天安門上太陽升"]# 1、實例化一個轉換器類transfer = CountVectorizer()data_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names())# 2、調用fit_transformreturn None更好的處理方式見下方案
jieba分詞處理
- jieba.cut()
- 返回詞語組成的生成器
需要安裝下jieba庫
pip install jieba
案例分析
data = ["在過去兩個月里,我和60多位小伙伴進行了1對1的一小時溝通;","TA絕大多數是想要嘗試副業變現的朋友。","從一線城市到三線城市,從寶媽到職場人,從職場到體制內。"]分析
-
準備句子,利用jieba.cut進行分詞
-
實例化CountVectorizer
-
將分詞結果變成字符串當作fit_transform的輸入值
問題:該如何處理某個詞或短語在多篇文章中出現的次數高這種情況?
Tf-idf文本特征提取
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的概率高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
TF-IDF作用:用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。
公式
詞頻(term frequency,tf)指的是某一個給定的詞語在該文件中出現的頻率
逆向文檔頻率(inverse document frequency,idf)是一個詞語普遍重要性的度量。某一特定詞語的idf,可以由總文件數目除以包含該詞語之
文件的數目,再將得到的商取以10為底的對數得到
最終得出結果可以理解為重要程度。
注:假如一篇文件的總詞語數是100個,而詞語"非常"出現了5次,那么"非常"一詞在該文件中的詞頻就是5/100=0.05。而計算文件頻率(IDF)的方法是以文件集的文件總數,除以出現"非常"一詞的文件數。所以,如果"非常"一詞在1,000份文件出現過,而文件總數是10,000,000份的話,其逆向文件頻率就是lg(10,000,000 / 1,0000)=3。最后"非常"對于這篇文檔的tf-idf的分數為0.05 * 3=0.15
案例
def tfidf_demo():"""用TF-IDF方法進行文本特征值抽取:return:"""data = ["在過去兩個月里,我和60多位小伙伴進行了1對1的一小時溝通;","TA絕大多數是想要嘗試副業變現的朋友。","從一線城市到三線城市,從寶媽到職場人,從職場到體制內。"]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 NoneTf-idf的重要性
分類機器學習算法進行文章分類中前期數據處理方式
特征預處理
目標
-
了解數值型數據、類別型數據特點
-
應用MinMaxScaler實現對特征數據進行歸一化
-
應用StandardScaler實現對特征數據進行標準化
什么是特征預處理
特征預處理:通過一些轉換函數將特征數據轉換成更加適合算法模型的特征數據過程
可以通過上面那張圖來理解
包含內容
數值型數據的無量綱化:
-
歸一化
-
標準化
特征預處理API
sklearn.preprocessing為什么我們要進行歸一化/標準化?
特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個數量級,容易影響(支配)目標結果,使得一些算法無法學習到其它的特征
我們需要用到一些方法進行無量綱化,使不同規格的數據轉換到同一規格
歸一化
定義
通過對原始數據進行變換把數據映射到(默認為[0,1])之間
公式
作用于每一列,max為一列的最大值,min為一列的最小值,那么X’’為最終結果,mx,mi分別為指定區間值默認mx為1、mi為0
API
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的數據[n_samples,n_features]
- 返回值:轉換后的形狀相同的array
- MinMaxScalar.fit_transform(X)
數據計算
我們對以下數據進行運算,在dating.txt中。保存的就是之前的約會對象數據
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分析
-
實例化MinMaxScalar
-
通過fit_transform轉換
歸一化總結
注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小數據場景。
標準化
定義
通過對原始數據進行變換把數據變換到均值為0,標準差為1范圍內
公式
作用于每一列,mean為平均值,σ為標準差
所以回到剛才異常點的地方,我們再來看看標準化
-
對于歸一化來說:如果出現異常點,影響了最大值和最小值,那么結果顯然會發生改變
-
對于標準化來說:如果出現異常點,由于具有一定數據量,少量的異常點
-
對于平均值的影響并不大,從而方差改變較小。
API
- sklearn.preprocessing.StandardScaler( )
- 處理之后每列來說所有數據都聚集在均值0附近標準差差為1
- StandardScaler.fit_transform(X)
- X:numpy array格式的數據[n_samples,n_features]
- 返回值:轉換后的形狀相同的array
數據計算
同樣對上面的數據進行處理
[[90,2,10,40], [60,4,15,45], [75,3,13,46]]分析
-
實例化StandardScaler
-
通過fit_transform轉換
標準化總結
在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大數據場景。
特征降維
目標
-
知道特征選擇的嵌入式、過濾式以及包裹氏三種方式
-
應用VarianceThreshold實現刪除低方差特征
-
了解相關系數的特點和計算
-
應用相關性系數實現特征選擇
降維
降維是指在某些限定條件下,降低隨機變量(特征)個數,得到一組“不相關”主變量的過程
-
降低隨機變量的個數
-
相關特征(correlated feature):相對濕度與降雨量之間的相關等等
正是因為在進行訓練的時候,我們都是使用特征進行學習。如果特征本身存在問題或者特征之間相關性較強,對于算法學習預測會影響較大
降維的兩種方式
-
特征選擇
-
主成分分析(可以理解一種特征提取的方式)
特征選擇
什么是特征選擇
定義: 數據中包含冗余或無關變量(或稱特征、屬性、指標等),旨在從原有特征中找出主要特征。
方法:
-
Filter(過濾式):主要探究特征本身特點、特征與特征和目標值之間關聯
- 方差選擇法:低方差特征過濾
- 相關系數
-
Embedded (嵌入式):算法自動選擇特征(特征與目標值之間的關聯)
- 決策樹:信息熵、信息增益
- 正則化:L1、L2
- 深度學習:卷積等
-
Wrapper (包裹式)
模塊
sklearn.feature_selection過濾式
低方差特征過濾
刪除低方差的一些特征,前面講過方差的意義。再結合方差的大小來考慮這個方式的角度。
-
特征方差小:某個特征大多樣本的值比較相近
-
特征方差大:某個特征很多樣本的值都有差別
API
- sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
- 刪除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的數據[n_samples,n_features]
- 返回值:訓練集差異低于threshold的特征將被刪除。默認值是保留所有非零方差特征,即刪除所有樣本中具有相同值的特征。
數據計算
我們對某些股票的指標特征之間進行一個篩選
一共這些特征
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():"""過濾低方差特征:return:"""# 1、獲取數據data = pd.read_csv("factor_returns.csv")data = data.iloc[:, 1: -2]print(data)# 2、實例化一個轉換器transfer = VarianceThreshold(threshold=5)# 3、調用fit_transformdata_new = transfer.fit_transform(data)print("data_new", data_new, data_new.shape)return Noneif __name__ == '__main__':# 低方差特征過濾variance_demo()相關系數
皮爾遜相關系數(Pearson Correlation Coefficient): 反映變量之間相關關系密切程度的統計指標
公式計算案例(了解,不用記憶)
公式:
比如說我們計算年廣告費投入與月均銷售額
= 0.9942
所以我們最終得出結論是廣告投入費與月平均銷售額之間有高度的正相關關系。
特點
相關系數的值介于–1與+1之間,即–1≤ r ≤+1。其性質如下:
-
當r>0時,表示兩變量正相關,r<0時,兩變量為負相關
-
當|r|=1時,表示兩變量為完全相關,當r=0時,表示兩變量間無相關關系
-
當0<|r|<1時,表示兩變量存在一定程度的相關。且|r|越接近1,兩變量間線性關系越密切;|r|越接近于0,表示兩變量的線性相關越弱
一般可按三級劃分:|r|<0.4為低度相關;0.4≤|r|<0.7為顯著性相關;0.7≤|r|<1為高度線性相關
這個符號:|r|為r的絕對值, |-5| = 5
API
from scipy.stats import pearsonr x : (N,) array_like y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)主成分分析
目標
-
應用PCA實現特征的降維
-
應用:用戶與物品類別之間主成分分析
什么是主成分分析(PCA)
定義:高維數據轉化為低維數據的過程,在此過程中可能會舍棄原有數據、創造新的變量
作用:是數據維數壓縮,盡可能降低原數據的維數(復雜度),損失少量信息。
應用:回歸分析或者聚類分析當中
那么更好的理解這個過程呢?我們來看一張圖
API
- sklearn.decomposition.PCA(n_components=None)
- 將數據分解為較低維數空間
- n_components:
- 小數:表示保留百分之多少的信息
- 整數:減少到多少特征
- PCA.fit_transform(X) X:numpy array格式的數據[n_samples,n_features]
- 返回值:轉換后指定維度的array
數據計算
[[2,8,4,5], [6,3,0,8], [5,4,9,1]] def pca():"""主成分分析進行降維: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案例:探究用戶對物品類別的喜好細分降維
數據
-
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在一張表當中
-
進行交叉表變換
-
進行降維
總結
以上是生活随笔為你收集整理的【机器学习】特征工程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习-sk-learn-Facebo
- 下一篇: 页面加载完后立刻执行JS的两种方法