天天看點

Scikit-learn特征工程之特征抽取

“ 資料,決定了機器學習的上限;而算法,隻是盡可能逼近這個上限。”

                    ——這句話很好的闡述了  資料  在機器學習中的重要性。

資料的特征工程

  • 大部分直接拿過來的資料都是特征不明顯的、沒有經過處理的或者說是存在很多無用的資料,那麼需要進行一些特征處理,特征的縮放等等,滿足訓練資料的要求;
  • 優質的特征往往描述了資料的固有結構;
  • 最初的原始特征資料集可能太大,或者資訊備援,是以在機器學習的應用中,一個初始步驟就是選擇特征的子集,或建構一套新的特征集,減少功能來促進算法的學習,提高泛化能力和可解釋性;
  • 特征工程的意義:更好的特征意味着

    魯棒性好(穩定性,抗幹擾能力)

    模型簡單

    ,可以得到

    更好的結果

1、

資料來源與類型

(1)來源  大部分的資料都來自已有的資料庫,如果沒有的話也可以交給很多爬蟲工程師去采集,來提供。也可以來自平時的記錄,反正資料無處不在,大都是可用的。

(2)類型

  • 按照

    機器學習的資料分類

    我們可以将資料分成:

    标稱型

    :标稱型目标變量的結果隻在有限目标集中取值,如真與假(标稱型目标變量

    主要用于分類

    );

    數值型

    :數值型目标變量則可以從無限的數值集合中取值,如0.100,42.001等 (數值型目标變量

    主要用于回歸分析

    )。
  • 按照

    資料的本身

    分布特性:

    離散型

    連續型

2、

資料的特征抽取

資料多數特征都不是連續變量,比如

分類

文字

圖像

等,為了對非連續變量做特征表述,需要對這些特征做數學化表述,是以就用到了

特征抽取

sklearn.feature_extraction

提供了特征提取的很多方法

(a)

分類

特征提取
  • 方法

    fit_transform(X, y)

    應用并轉化映射清單X,y為目标類型
  • 方法

    inverse_transform(X, [dict_type])

    将Numpy數組或scipy.sparse矩陣轉換為映射清單
from sklearn.feature_extraction import DictVectorizer

onehot = DictVectorizer(sparse=True)                   # sparse = True轉換為sparse矩陣,預設開啟
instances = [{'city': '北京','temperature':100},
             {'city': '上海','temperature':60},
             {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances).toarray()          # toarray()将sparse矩陣轉換為Numpy數組
print(onehot.inverse_transform(X))                     # 傳回轉換之前資料格式
print(onehot.get_feature_names())                      # 傳回特征名稱
print(X, type(X))

# ===運作結果:================================================================

[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'temperature': 30.0, 'city=深圳': 1.0}]
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]] <class 'numpy.ndarray'>
           
onehot = DictVectorizer()                             # sparse=True預設開啟
instances = [{'city': '北京','temperature':100},
             {'city': '上海','temperature':60},
             {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances)
print(onehot.get_feature_names())
print(X, type(X))
# ===運作結果:================================================================
['city=上海', 'city=北京', 'city=深圳', 'temperature']
  (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0 <class 'scipy.sparse.csr.csr_matrix'>
           
onehot = DictVectorizer(sparse=False)
instances = [{'city': '北京','temperature':100},
             {'city': '上海','temperature':60},
             {'city': '深圳','temperature':30}]
X = onehot.fit_transform(instances)
print(onehot.get_feature_names())
print(X, type(X))
# ===運作結果:================================================================
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]] <class 'numpy.ndarray'>
           
(b)

文本

特征抽取
  • 文本分類是通過詞是否存在、以及詞的機率(重要性)來表示
from sklearn.feature_extraction.text import CountVectorizer

content = ["life is short,i like python","python is such easy,i like python"]
vectorizer = CountVectorizer()
X= vectorizer.fit_transform(content).toarray()
print(vectorizer.get_feature_names())
print(X, type(X))

# ===運作結果:================================================================

['easy', 'is', 'life', 'like', 'python', 'short', 'such']
[[0 1 1 1 1 1 0]
 [1 1 0 1 2 0 1]] <class 'numpy.ndarray'>
           
  • TF-IDF表示詞的重要性,TfidfVectorizer會根據指定的公式将文檔中的詞轉換為機率表示
from sklearn.feature_extraction.text import TfidfVectorizer

content = ["life is short,i like python","python is such easy,i like python"]
vectorizer = TfidfVectorizer(stop_words='english')
X= vectorizer.fit_transform(content).toarray()
print(vectorizer.get_feature_names())
print(X, type(X))
print(vectorizer.vocabulary_)

# ===運作結果:================================================================

['easy', 'life', 'like', 'python', 'short']
[[0.         0.57615236 0.40993715 0.40993715 0.57615236]
 [0.53215436 0.         0.37863221 0.75726441 0.        ]] <class 'numpy.ndarray'>
{'python': 3, 'life': 1, 'short': 4, 'like': 2, 'easy': 0}
           

繼續閱讀