1. 程式人生 > 其它 >scikit-learn機器學習筆記——特徵提取、特徵處理

scikit-learn機器學習筆記——特徵提取、特徵處理

技術標籤:scikit-learn機器學習機器學習scikit-learn

scikit-learn機器學習筆記——特徵提取、特徵處理

資料特徵提取

  • 特徵提取針對非連續型字典等資料特徵值化
  • 特徵提取對文字等進行特徵值化

scikit-learn特徵抽取的API :sklearn.feature_extraction

字典特徵提取

作用:對字典資料進行特徵值化

類:sklearn.feature_extraction.DictVectorizer

DictVectorizer語法:

  • DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X)
      • X:字典或者包含字典的迭代器
      • 返回值:返回sparse矩陣
    • DictVectorizer.inverse_transform(X)
      • X:array陣列或者sparse矩陣
      • 返回值:轉換之前資料格式
    • DictVectorizer.get_feature_names()
      • 返回類別名稱
    • DictVectorizer.transform(X)
      • 按照原先的標準轉換

程式碼示例:

from sklearn.feature_extraction import DictVectorizer


def
dic_extract(X): ''' 字典特徵抽取 :return: None ''' # 例項化類DictVectorizer dic = DictVectorizer(sparse=False) # 呼叫fit_transform方法輸入資料並轉換 注意返回格式 data = dic.fit_transform(X) print(dic.get_feature_names()) print(data) return None if __name__ == '__main__': X = [
{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}] dic_extract(X)
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

文字特徵提取

作用:對文字資料進行特徵值化
注意:文字特徵提取不會統計單個字母或漢字

類:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer語法:

  • CountVectorizer(max_df=1.0,min_df=1,…)
    返回詞頻矩陣
    • CountVectorizer.fit_transform(X)
      • X:文字或者包含文字字串的可迭代物件
      • 返回值:返回sparse矩陣
    • CountVectorizer.inverse_transform(X)
      • X:array陣列或者sparse矩陣
      • 返回值:轉換之前資料格式
    • CountVectorizer.get_feature_names()
      • 返回值:單詞列表

程式碼示例:英文文字特徵提取

from sklearn.feature_extraction.text import CountVectorizer

def text_extract(X):
    '''
    文字特徵提取
    :return: None
    '''
    # 例項化CountVectorizer
    text = CountVectorizer()
    # 呼叫fit_transform方法輸入資料並轉換
    # 注意返回格式,利用toarray()進行sparse矩陣轉換array陣列
    data = text.fit_transform(X)
    print(data)
    print(text.get_feature_names())
    print(data.toarray())
    return None



if __name__ == '__main__':
    X = ["life is short,i like python" ,
         "life is too long,i dislike python"]
    text_extract(X)
  (0, 2)	1
  (0, 1)	1
  (0, 6)	1
  (0, 3)	1
  (0, 5)	1
  (1, 2)	1
  (1, 1)	1
  (1, 5)	1
  (1, 7)	1
  (1, 4)	1
  (1, 0)	1
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

中文文字特徵提取

使用jieba分詞

API:jieba.cut

返回值:詞語生成器

程式碼示例:中文文字特徵提取

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def text_extract(X):
    '''
    中文文字特徵提取
    :return: None
    '''
    # 例項化CountVectorizer
    text = CountVectorizer()
    #準備句子,利用jieba.cut進行分詞
    data = []
    for i in range(len(X)):
        # print(X[i])
        data.append(list(jieba.cut(X[i])))

    print(data)
    # 將分詞結果變成字串當作fit_transform的輸入值
    con = []
    for i in range(len(data)):
        con.append(' '.join(data[i]))
    print(con)

    cn_text = text.fit_transform(con)
    print(text.get_feature_names())
    # 注意返回格式,利用toarray()進行sparse矩陣轉換array陣列
    print(cn_text.toarray())
    return None



if __name__ == '__main__':
    X = ['今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。' ,
         '我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。' ,
         '如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。']
    text_extract(X)
['一種', '不會', '不要', '之前', '瞭解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決於', '只用', '後天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '祕密', '絕對', '美好', '聯絡', '過去', '這樣']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]

TF-IDF

  TF-IDF是一個用於資訊檢索和聚類的詞加權方法,給出語料庫文件中單詞的權重,表示重要性。
  TF(item frequency,詞頻):衡量詞在文件中出現的頻率。由於文件的長度不同,詞在長文中出現次數有可能比在短文中出現的次數多得多。因此,一般會對詞頻進行歸一化,用其除以文件長度或文件的總詞數。
  IDF(inverse document frequency,逆文件頻率):衡量詞的重要性。在計算詞頻時,我們認為所有的詞都同等重要。但是某些詞(如is、of和that)有可能出現很多次,但這些詞並不重要。因此,我們需要減少常見詞的權重,加大稀有詞的權重。

類:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer語法

  • TfidfVectorizer(stop_words=None,…) • 返回詞的權重矩陣
    • TfidfVectorizer.fit_transform(X,y)
    • X:文字或者包含文字字串的可迭代物件
    • 返回值:返回sparse矩陣
    • TfidfVectorizer.inverse_transform(X)
    • X:array陣列或者sparse矩陣
    • 返回值:轉換之前資料格式
    • TfidfVectorizer.get_feature_names()
    • 返回值:單詞列表

程式碼示例:

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def tfidf_text_extract(X):
    '''
    中文文字特徵提取
    :return: None
    '''
    # 例項化CountVectorizer
    text = TfidfVectorizer()
    #準備句子,利用jieba.cut進行分詞
    data = []
    for i in range(len(X)):
        # print(X[i])
        data.append(list(jieba.cut(X[i])))

    print(data)
    # 將分詞結果變成字串當作fit_transform的輸入值
    con = []
    for i in range(len(data)):
        con.append(' '.join(data[i]))
    print(con)

    cn_text = text.fit_transform(con)
    print(text.get_feature_names())
    # 注意返回格式,利用toarray()進行sparse矩陣轉換array陣列
    print(cn_text.toarray())
    return None



if __name__ == '__main__':
    X = ['今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。' ,
         '我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。' ,
         '如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。']
    tfidf_text_extract(X)
['一種', '不會', '不要', '之前', '瞭解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決於', '只用', '後天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '祕密', '絕對', '美好', '聯絡', '過去', '這樣']
[[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

資料特徵處理

  特徵處理:通過特定的統計方法(數學方法)將資料轉換成演算法要求的資料。

數值型資料:

  • 歸一化
  • 標準化
  • 缺失值

類別型資料:

  • one-hot編碼

時間型別:

  • 時間的切分

sklearn特徵處理API:sklearn. preprocessing

歸一化

通過對原始資料進行變換把資料對映到(預設為[0,1])之間。

公式: X ′ = x − min ⁡ max ⁡ − min ⁡ X ′ ′ = X ′ ∗ ( m x − m i ) + m i \quad X^{\prime}=\frac{x-\min }{\max -\min } \quad X^{\prime \prime}=X^{\prime} *(m x-m i)+m i X=maxminxminX=X(mxmi)+mi

注:作用於每一列,max為一列的最大值, min為一列的最小值, X" 為最終結果, m x , \mathrm{mx}, mx, mi分別為指定區間值預設mx為1,mi為0

分為兩步:1.歸一化,2.轉換到指定區間

sklearn歸一化API:sklearn歸一化API: sklearn.preprocessing.MinMaxScaler

MinMaxScaler語法:

  • MinMaxScalar(feature_range=(0,1)…) • 每個特徵縮放到給定範圍(預設[0,1])
  • MinMaxScalar.fit_transform(X)
  • X:numpy array格式的資料[n_samples,n_features]
  • 返回值:轉換後的形狀相同的array

程式碼示例:最大最小化

from sklearn.preprocessing import MinMaxScaler

def min_max(X):
    '''
    最大最小化
    :param X:
    :return:None
    '''
    print(X)
    # 例項化
    min_max = MinMaxScaler()
    # 轉換資料
    data = min_max.fit_transform(X)
    print(data)

if __name__ == '__main__':
    X = [[90,2,10,40],
        [60,4,15,45],
        [75,3,13,46]]
    min_max(X)
[[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
[[1.         0.         0.         0.        ]
 [0.         1.         1.         0.83333333]
 [0.5        0.5        0.6        1.        ]]

歸一化總結:

  注意在特定場景下最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統精確小資料場景。

標準化

通過對原始資料進行變換把資料變換到均值為0,方差為1範圍內。

公式: X ′ = x − mean σ X^{\prime}=\frac{x-\text { mean }}{\sigma} X=σxmean

注: 作用於每一列,mean為平均值, σ \sigma σ 為標準差(考量資料的穩定性)
std成為方差, s t d = ( x 1 − m e a n ) 2 + ( x 2 − m e a n ) 2 + ⋯ n ( 每個特徵的樣本數 ) − 1 , σ = s t d s t d=\frac{(x 1-m e a n)^{2}+(x 2-m e a n)^{2}+\cdots} {n(\text { 每個特徵的樣本數 })-1}, \quad \sigma=\sqrt{\mathrm{std}} std=n(每個特徵的樣本數)1(x1mean)2+(x2mean)2+,σ=std

  對於歸一化來說:如果出現異常點,影響了最大值和最小值,那麼結果顯然會發生改變。

  對於標準化來說:如果出現異常點,由於具有一定資料量,少量的異常點對於平均值的影響並不大,從而方差改變較小。

sklearn標準化API:scikit-learn.preprocessing.StandardScaler

StandardScaler語法

  • StandardScaler(…)
  • 處理之後每列來說所有資料都聚集在均值0附近方差為1
    • StandardScaler.fit_transform(X,y)
      • X:numpy array格式的資料[n_samples,n_features]
      • 返回值:轉換後的形狀相同的array
    • StandardScaler.mean_
      • 原始資料中每列特徵的平均值
    • StandardScaler.std_
      • 原始資料每列特徵的方差

程式碼示例:標準化

from sklearn.preprocessing import StandardScaler

def standard(X):
    '''
    標準化
    :param X:
    :return:None
    '''
    print(X)
    # 例項化
    stand = StandardScaler()
    # 轉換資料
    data = stand.fit_transform(X)
    print(data)
    print(stand.mean_, stand.scale_)

if __name__ == '__main__':
    X = [[ 1., -1., 3.],
        [ 2., 4., 2.],
        [ 4., 6., -1.]]
    standard(X)
[[1.0, -1.0, 3.0], [2.0, 4.0, 2.0], [4.0, 6.0, -1.0]]
[[-1.06904497 -1.35873244  0.98058068]
 [-0.26726124  0.33968311  0.39223227]
 [ 1.33630621  1.01904933 -1.37281295]]
[2.33333333 3.         1.33333333] [1.24721913 2.94392029 1.69967317]

標準化總結

  在已有樣本足夠多的情況下比較穩定,適合現代嘈雜大資料場景。

缺失值

缺失值處理方法:

  • 刪除
    如果每列或者行資料缺失值達到一定的比例,建議放棄整
    行或者整列。
  • 插補
    可以通過缺失值每行或者每列的平均值、中位數來填充。

sklearn缺失值API: from sklearn.impute import SimpleImputer

SimpleImputer語法

  • SimpleImputer(*, missing_values=nan, strategy=‘mean’,
    fill_value=None, verbose=0, copy=True, add_indicator=False)[source]
    • SimpleImputer.fit_transform(X)
      • X:numpy array格式的資料[n_samples,n_features]
      • 返回值:轉換後的形狀相同的array

SimpleImputer流程:

1、初始化Imputer,指定”缺失值”,指定填補策略,指定行或列。
注:缺失值也可以是別的指定要替換的值。
2、呼叫fit_transform。

from sklearn.impute import SimpleImputer
import numpy as np


def miss_values(X):
    '''
    缺失值填補
    :param X:
    :return:
    '''
    print(X)
    # 例項化SimpleImputer(missing_values='nan', strategy='mean')
    mis_val = SimpleImputer(strategy='mean')
    # 轉換資料
    data = mis_val.fit_transform(X)
    print(data)
    return None

if __name__ == '__main__':
    X = [[1, 2],
        [np.nan, 3],
        [7, 6]]
    miss_values(X)

[[1, 2], [nan, 3], [7, 6]]
[[1. 2.]
 [4. 3.]
 [7. 6.]]