1. 程式人生 > >機器學習——特徵工程和文字特徵工程提取

機器學習——特徵工程和文字特徵工程提取

機器學習的資料:檔案csv

可用的資料集:

  1. scikit-learn  :資料量小,方便學習
  2. kaggle: 大資料競賽平臺,真實資料,資料量巨大
  3. UCI:收錄了360個數據集,覆蓋科學、生活、經濟等領域,資料量幾十萬

常用資料集資料的結構組成

  • 結構:特徵值+目標值
  房子面積 房子位置 房子樓層 房子朝向 目標值
資料1 80 9 3 0 80
資料2 100 9 5 1 120
資料3 80 10 3 0 100

 

房子面積、房子位置、房子樓層、房子朝向皆為特徵值

注意:有些資料集可用沒有目標值

特徵工程

特徵工程是將原始資料轉換為更好地代表預測模型的潛在問題的特徵的過程,從而提高了對未知資料的預測準確性

資料的特徵抽取

下面用例項說明:

#特徵抽取
#匯入包
from sklearn.feature_extraction.text import CountVectorizer
#例項化CountVectorizer
vector=CountVectorizer()
#呼叫fit_transform進行並轉換資料
res=vector.fit_transform(["Life is short,i like python","life is too long,i dislike python"])
#列印結果
print(vector.get_feature_names()) #列印特徵值
print(res.toarray())

執行結果如下所示:

特徵抽取對文字等資料進行特徵值化

字典特徵抽取

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

類:sklearn.feature_extraction.CountVectorizer

DictVectorizer(sparse=True,...)

  • DictVectorizer.fit_transform(X)     

              X:字典或者包含字典的迭代器

               返回值:返回sparse矩陣

  • DictVectorizer.inverse_transform(X)

              X:array陣列或者sparse矩陣

              返回值:轉換之前資料格式

  • DictVectorizer.get_feature_names()

             返回類別的名稱

  • DictVectorize.transform(X)

           按照原先的標準轉換

 

例項說明:

from sklearn.feature_extraction import DictVectorizer


def dictverc():
    """
    字典資料抽取
    """
    # 例項化
    dict = DictVectorizer()
    # 呼叫fit_transform 返回sparse距陣
    data = dict.fit_transform(
        [{'city': u'beijing', 'temperature': 100}, {'city': u'shanghai', 'temperature': 90}, {'city':u 'qingdao', 'temperature': 80}]);
    # 輸出
    #print(data)
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
if __name__=="__main":
    dictverc()

字典資料抽取:把字典中一些類別資料,分別進行轉換成特徵

執行結果

文字特徵抽取

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

類:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer()

  • 返回詞頻矩陣
  • 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 countvec():
    """
    對文字進行特徵值化
    :return: None
    """
    cv=CountVectorizer()
    data=cv.fit_transform({"人生苦短,我喜歡python","人生漫長,不用python"})
    print(data.toarray())
    return None
if __name__=="__main":
    countvec()

執行結果如下:

  • 統計文章的所有詞,重複的只看作一次 詞的列表
  • 對每篇文章,在詞的列表裡面進行統計每個詞出現的次數
  • 單個字母不統計

中文的文字特徵抽取

jieba分詞

import jieba

返回值:詞語生成器

程式碼例項說明

from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cutword():
    con1=jieba.cut("今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。")
    con2=jieba.cut("我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。")
    con3=jieba.cut("如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。  瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。")
    #轉換成列表
    content1=list(con1)
    content2 = list(con2)
    content3 = list(con3)
    #把列表轉換成字串
    c1= ' '.join(con1)
    c2 = ' '.join(con2)
    c3 = ' '.join(con3)

    return c1,c2,c3
def hanzivec():
    """
    中文特徵值化:
    :return:
    """
    c1,c2,c3=cutword()
    print(c1,c2,c3)
    cv = CountVectorizer()
    data = cv.fit_transform([c1,c2,c3])
    # data = cv.fit_transform({"人生苦短,我喜歡python", "人生漫長,不用python"})
    print(cv.get_feature_names())
    print(data.toarray())
    return None
if __name__=="__main":
    hanzivec()

執行結果如下所示:

單個詞不會被統計在內

tf-idf分析問題

Tf:term frequency:詞的頻率    出現的次數

idf:inverse document frequency 逆文件頻率  log(總文件數量/該詞出現的文件數)

log(數值):輸入的數值越小,結果越小

反應的是重要性的程度

TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的概率高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。

TF-IDF作用:用以評估一字詞對於一個檔案集或一個語料庫中的其他一份檔案的重要程度。

類:sklearn.feature_extraction.text.TfidfVectorizer

  • TfidfVectorizer(stop_words=None,...)

         返回詞的權重矩陣

  • tfidfVectorizer.fit_transform(X)

        X:文字或者包含文字字串的可迭代物件

        返回值:返回sparse矩陣

  • tfidfVectorizer:inverse_transform(X)

        X:array陣列或者sparse矩陣

        返回值:轉換之前資料形式

  • tfidfVectorizer.get_feature_names()

        返回值:單詞列表

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cutword():
    con1=jieba.cut("今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。")
    con2=jieba.cut("我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。")
    con3=jieba.cut("如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。  瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。")
    #轉換成列表
    content1=list(con1)
    content2 = list(con2)
    content3 = list(con3)
    #把列表轉換成字串
    c1= ' '.join(con1)
    c2 = ' '.join(con2)
    c3 = ' '.join(con3)

    return c1,c2,c3
def tfidfvec():
    """
    中文特徵值化
    :return: None
    """
    c1, c2, c3 = cutword()
    print(c1, c2, c3)
    tf= TfidfVectorizer
    data = tf.fit_transform([c1,c2,c3])
    print(data)
    return None
if __name__=="__main":
    tfidfvec()

執行結果如下所示: