1. 程式人生 > >AI學習---特征工程(Feature Engineering)

AI學習---特征工程(Feature Engineering)

調用 比較 itl oar bubuko 工程 import 單詞 int

為什麽需要特征工程(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)