AI學習---特征工程(Feature Engineering)
為什麽需要特征工程(Feature Engineering)
數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已
什麽是特征工程
幫助我們使得算法性能更好發揮性能而已
sklearn主要用於特征工程
pandas主要用於數據清洗、數據處理
特征工程包含如下3個內容:
1、特征抽取/特征提取
|__>字典特征抽取
|__>文本特征抽取
|__>圖像特征抽取(深度學習)
2、特征預處理
3、特征降維
- 特征抽取/特征提取
我們常說的機器學習算法
實際上就是我們統計學上的統計方法也就是我們數學上的數學公式即 機器學習算法--》統計方法--》數學公式
字典特征抽取的應用場景:
1)pclass, sex 數據集當中類別特征比較多
1、將數據集的特征 轉換為字典類型
2、利用DictVectorizer轉換為二維數組
2)本身拿到的數據就是字典類型
1- 字典特征提取:
當我們調用sklearn.feature_extraction.DictVectorizer(sparse=True,…)的時候,實際上就是初始化了一個父類的轉換器對象,然後調用實例進行fit_transform(X),進行字典和數值的轉換。
(下圖)有多少行數據就有多少個向量(有方向和大小),向量在計算機中以矩陣存儲(二維數組),而矩陣的行和列都可以看做一個一維數組。下圖中一行數據可以看做一個向量,n個樣本有n個向量,即將字典轉換為了計算機識別的二維數組。每一個樣本有2個特征(城市+temperature),正常應該返回一個3行2列的矩陣,但是字典特征抽取後,樣本量沒有變(3個樣本),但是特征量變成了4個(當特征中有類別的時候,要想表示成數值,又想要公平的表示數據,我們采用one-hot編碼,有3個類別,就占用3列,如果是北京,則第二列的特征值就是1,最後添加上temperature就是4個特征了)。
字典特征抽取DEMO:
from sklearn.feature_extraction.dict_vectorizer import DictVectorizer # 字典特征提取 def dic_demo(): data = [{‘city‘: ‘北京‘, ‘temperature‘: 100}, {‘city‘: ‘上海‘, ‘temperature‘: 60}, {‘city‘: ‘深圳‘, ‘temperature‘: 30}] # 1、實例化一個轉換器對象 # transform = DictVectorizer(sparse=True) # 默認開啟稀疏矩陣 transform = DictVectorizer(sparse=False) # 默認sparse=True, # 2、調用fit_transform() new_data = transform.fit_transform(data) # 3、獲取特征名稱 print("特征名字:\n", transform.get_feature_names()) # 特征名字:[‘city=上海‘, ‘city=北京‘, ‘city=深圳‘, ‘temperature‘] print(‘轉換後的結果:\n‘, new_data) ‘‘‘ # sparse=True時候的new_data的值:返回的new_data是一個sparse的稀疏矩陣 (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0 # sparse=True時候的new_data的值,返回的是一個二維數組 [[ 0. 1. 0. 100.] [ 1. 0. 0. 60.] [ 0. 0. 1. 30.]] # 總結: 稀疏矩陣將非零值按位置表示出來,這樣做可以節省內存 - 提高加載效率 ‘‘‘ if __name__ == ‘__main__‘: dic_demo()
結果截圖:
附:
one-hot編碼:
對特征中的類別信息,為了公平的表示每一組樣本數據,我們處理的時候,就是根據類別進行劃分,樣本中幾個類別就有幾列,是這個數據則置該列的數值為1,否則為0
2- 文本特征提取:
文本特征提取就是將單詞、字母、短語作為主要的特征詞進行特征提取
可以利用如下方法統計:
CountVectorizer:統計的是文本中出現的特征詞次數,stop_words停用的停詞表,toarray()可以轉換為二維數組
英文的測試DEMO
from sklearn.feature_extraction.text import CountVectorizer # 文本特征提取 def text_count_demo(): data = ["life is short,i like like python", "life is too long, i dislike python"] # 1、實例化一個轉換器類 transfer = CountVectorizer() # transfer = CountVectorizer(stop_words=["is", "too"]) ‘‘‘ 不添加stop_words的效果:transfer = CountVectorizer() data_new: [[0 1 1 2 0 1 1 0] [1 1 1 0 1 1 0 1]] 特征名字: [‘dislike‘, ‘is‘, ‘life‘, ‘like‘, ‘long‘, ‘python‘, ‘short‘, ‘too‘] 添加stop_words的效果: transfer = CountVectorizer(stop_words=["is", "too"]) data_new: [[0 1 2 0 1 1] [1 1 0 1 1 0]] 特征名字: [‘dislike‘, ‘life‘, ‘like‘, ‘long‘, ‘python‘, ‘short‘] ‘‘‘ # 2、調用fit_transform data_new = transfer.fit_transform(data) # data_new返回的是一個sparse矩陣, print("矩陣_data_new:\n", data_new) # data_new.toarray()返回的是一個二維數組 print("數組_data_new:\n", data_new.toarray()) ‘‘‘ 矩陣_data_new: (0, 5) 1 (0, 3) 2 (0, 6) 1 (0, 1) 1 (0, 2) 1 (1, 0) 1 (1, 4) 1 (1, 7) 1 (1, 5) 1 (1, 1) 1 (1, 2) 1 數組_data_new.toarray(): [[0 1 1 2 0 1 1 0] [1 1 1 0 1 1 0 1]] ‘‘‘ print("特征名字:\n", transfer.get_feature_names()) return None if __name__ ==‘__main__‘: text_count_demo()
中文的分詞DEMO效果:
from sklearn.feature_extraction.text import CountVectorizer # 中文的需要進行分詞,否則是以整句作為分詞的 def chinese_text_count_demo(): data = ["我愛北京天安門", "天安門上太陽升"] # data = ["我 愛 北京 天安門", "天安門 上 太陽 升"] # 添加了空格的中文分詞 ‘‘‘ 未添加空格的中文分詞: data_new: [[0 1] [1 0]] 特征名字: [‘天安門上太陽升‘, ‘我愛北京天安門‘] 添加了空格的中文分詞: [[1 1 0] [0 1 1]] 特征名字: [‘北京‘, ‘天安門‘, ‘太陽‘] ‘‘‘ # 1、實例化一個轉換器類 transfer = CountVectorizer() # 2、調用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None if __name__ ==‘__main__‘: chinese_text_count_demo()
- 特征預處理
- 特征降維
AI學習---特征工程(Feature Engineering)