1. 程式人生 > >機器學習 -- 1 特徵抽取

機器學習 -- 1 特徵抽取

1 概述

使用Scikit-learn提供的特徵抽取API進行特徵的抽取

  • 字典特徵抽取
from sklearn.feature_extraction import DictVectorizer


# 1 例項化DictVectorizer
def dicvec():
    # 例項化:
    # 預設sparse為True打印出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
    '''
    # false輸出
    '''
    [[  0.   1.   0. 100.]
    [  1.   0.   0.  60.]
    [  0.   0.   1.  30.]]  
    '''
    dict = DictVectorizer(sparse=False)
    # 呼叫fit_transfom
    data = dict.fit_transform([{'city': '北京', 'temperature': 100},
                        {'city': '上海', 'temperature': 60},
                        {'city': '深圳', 'temperature': 30}])
    # 字典資料抽取
    # 把離散值每一個轉化為多列 有多少種可能取值就有多少列  其值那一列為1 其餘為0
    # 即符合 one-hot 編碼
    # 連續值轉化為 一列 輸入數
    print(dict.get_feature_names())
    print(data)
    return None

if __name__=="__main__":
    dicvec()
  • 文字特徵抽取(漢字使用jieba分詞)
from sklearn.feature_extraction.text import CountVectorizer
import jieba

# CountVectorizer 返回詞頻矩陣
# 對文字進行特徵值化
def CoubtVec():

    cv = CountVectorizer()
    data = cv.fit_transform(["life is short,i like python like","python is the thing for commom people"])
    # 按照字母順序排列單詞
    print(cv.get_feature_names())
    # 1- 統計文章中所有的詞 重複的只看一次
    # 2- 對每篇文章統計每個單詞出現的字數
    # 注意:單個字母不參與統計 預設直接放棄 一個英文字母對文章的分析用處不是很大 所以加以放棄
    # 在文字特徵抽取時沒有sparse=False選項
    # 但是給予sklearn就會有 .toarray()
    print(data.toarray())
    print('*'*50)
    # 對中文預設不支援
    data_zh = cv.fit_transform(["人生苦短,我用python","python太難,我學java"])
    print(cv.get_feature_names())
    # ['python太難', '人生苦短', '我學java', '我用python']
    print(data_zh)
    print("*"*50)

    return None
# 使用jieba分詞
def cutWord(senten):
    # 返回的是詞法生成器
    con = jieba.cut(senten)
    # 返回以空格隔開的字串
    return ' '.join(list(con))

def hanzi():
    # 使用jieba分詞結果:

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

    cv = CountVectorizer()
    data = cv.fit_transform([con1,con2,con3])
    print(cv.get_feature_names())
    print(data.toarray())

    return None

if __name__ == "__main__":
    CoubtVec()
    hanzi()

– 輸出結果

['一種', '不會', '不要', '之前', '瞭解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決於', '只用', '後天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '祕密', '絕對', '美好', '聯絡', '過去', '這樣']
[[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: term frequency :詞頻
    idf inverse document frquency :逆文件頻率
    公式: log(總文件/該詞出現的文件數量)
    重要性程度: tf * idf
    TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的概率高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
    TF-IDF作用:用以評估一字詞對於一個檔案集或一個語料庫中的其中一份檔案的重要程度
類:sklearn.feature_extraction.text.TfidfVectorizer
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

# 使用jieba分詞
def cutWord(senten):
    # 返回的是詞法生成器
    con = jieba.cut(senten)
    # 返回以空格隔開的字串
    return ' '.join(list(con))

def tf_idfhanzi():
    seten1 = "今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。"
    seten2 = "我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。"
    seten3 = "如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。"
    con1 = cutWord(seten1)
    con2 = cutWord(seten2)
    con3 = cutWord(seten3)
    tf = TfidfVectorizer()
    data = tf.fit_transform([con1,con2,con3])
    print(tf.get_feature_names())
    print(data.toarray())
    return None

if __name__ =="__main__":
    tf_idfhanzi()
  • 輸出重要性矩陣
['一種', '不會', '不要', '之前', '瞭解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決於', '只用', '後天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '祕密', '絕對', '美好', '聯絡', '過去', '這樣']
[[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.        ]]