1. 程式人生 > >特徵工程之特徵抽取

特徵工程之特徵抽取

機器學習(Machine Learning, ML)是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、演算法複雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。它是人工智慧的核心,是使計算機具有智慧的根本途徑,其應用遍及人工智慧的各個領域,它主要使用歸納、綜合而不是演繹。(本文是個人的筆記,有些內容是引用)

有這麼一句話在業界廣泛流傳:資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。那特徵工程到底是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始資料中提取特徵以供演算法和模型使用。說白了特徵工程就是將你自己收集到的資料轉化為演算法需要的資料形式。下圖是一個例子


接下來介紹幾種比較常見的特徵抽取

字典特徵抽取(使用sklearn)

字典資料抽取:把字典中一些類別資料,分別進行轉換成特徵,對於本來就是數值型的資料比如說溫度等直接保留,而對於有類別的資料則要先轉化為字典資料,sklearn中採用one-hot編碼的方式處理。

下面是one-hot編碼的舉例:

原字典

{'city':'北京','temperature':100},{'city':'上海','temperature':20},{'city':'杭州','temperature':90}

one-hot編碼後的字典:

{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 20.0}, {'city=杭州': 1.0, 'temperature': 90.0}

經過sklearn處理後轉化成的陣列:


可以清楚的看到city是用類別的,所以說先將city=城市名轉化為特徵名(一個類別對應一個特徵名),接著如果1代表符合特徵,0代表不符合。

下面是使用sklearn編寫的簡單字典資料抽取的程式碼:

from sklearn.feature_extraction import DictVectorizer

def dictvec():
    """
    字典資料抽取
    :return: None
    """
    #例項化
    dict = DictVectorizer()
    #呼叫fit_transform()
    data = dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':20},{'city':'杭州','temperature':90}])
    print('預設返回sparse矩陣')#好處在於節約記憶體,方便儲存
    print(data)

    #對比
    dict1 = DictVectorizer(sparse=False)
    data1 = dict1.fit_transform([{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 20}, {'city': '杭州', 'temperature': 90}])
    print('原陣列')
    print(dict1.get_feature_names())#檢視特徵名稱
    print(data1)

    return None

if __name__ == "__main__":
    dictvec()
執行結果:


文字特徵抽取(使用sklearn庫)

CounterVectorizer方法

a、統計所有文章中當前所有的詞,重複的字看做一次->詞的列表

b、對每一篇文章,在詞的列表裡面進行統計每個詞出現的次數(其中單個字母不統計)

下面是Python程式碼:

def countvec():
    """
    對文字進行特徵值化
    :return: None
    """
    cv = CountVectorizer()

    #預設返回sparse矩陣
    data = cv.fit_transform(["life is short,i like python is","life is too too long,i dislike python"])

    print(cv.get_feature_names())
    print(data.toarray())

    return None

執行結果:


如果要想處理中文則需要先進行分詞處理(這裡使用jieba進行分詞)

下面是對中文文字進行特徵抽取的Python程式碼:

def cutword():
    con1 = jieba.cut("有這麼一句話在業界廣泛流傳:資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。那特徵工程到底是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始資料中提取特徵以供演算法和模型使用。")
    con2 = jieba.cut("資訊冗餘:對於某些定量特徵,其包含的有效資訊為區間劃分,例如學習成績,假若只關心“及格”或不“及格”,那麼需要將定量的考分,轉換成“1”和“0”表示及格和未及格。二值化可以解決這一問題。")

    #轉化成列表
    content1 = list(con1)
    content2 = list(con2)

    #把列表轉換成字串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)

    return c1,c2

def hanzivec():
    """
    中文特徵值化
    :return: None
    """
    c1,c2 = cutword()
    print(c1,c2)
    cv = CountVectorizer()

    # 預設返回sparse矩陣
    data = cv.fit_transform([c1,c2])

    print(cv.get_feature_names())
    print(data.toarray())

    return None
執行結果:


tfidf

在文章分類的應用場景中,只使用詞語出現的次數進行特徵抽取是沒有用的,因為會有很多其他詞(例如所以等中性詞)
會影響演算法對於文字的分析,所以我們需要將其他詞彙歸於一類。達到下圖的效果


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

 Tf:term frequency詞的頻率

 idf:inverse document frequency:log(總文件數量/該次出現的文件數量)

 詞的重要性=tf*idf

 這樣可以算出哪些詞對於當篇文章的重要性比較大,也就可以實現文章分類的需求

下面是用TF-IDF進行文字特徵提取的Python程式碼:

def tfidfvec():
    """
    中文特徵值化
    :return: None
    """
    c1,c2 = cutword()
    print(c1,c2)
    tf = TfidfVectorizer()

    # 預設返回sparse矩陣
    data = tf.fit_transform([c1,c2])

    print(tf.get_feature_names())
    print(data.toarray())

    return None
下面是執行結果:



相關推薦

機器學習特徵工程特徵抽取

1.資料集 資料集是特徵抽取的源資料。常用資料集的結構組成:特徵值+目標值。 資料中對於特徵的處理 pandas:一個數據讀取非常方便以及基本的處理格式的工具。 sklearn:對於特徵的處理提供了強大的介面。 2.資料的特徵工程 2

特徵工程特徵抽取

機器學習(Machine Learning, ML)是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、演算法複雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。它是人工智慧的核心,是使

1. 特徵工程特徵預處理

1. 前言 “資料決定了機器學習的上限,而演算法只是儘可能逼近這個上限”,這裡的資料指的就是經過特徵工程得到的資料。特徵工程指的是把原始資料轉變為模型的訓練資料的過程,它的目的就是獲取更好的訓練資料特徵,使得機器學習模型逼近這個上限。特徵工程能使得模型的效能得到提升,有時甚至在簡單的模型上也能取得不錯的效果

2. 特徵工程特徵選擇

1. 前言 當資料預處理完成後,我們需要選擇有意義的特徵輸入機器學習的演算法和模型進行訓練。 在做資料分析的時候,特徵的來源一般有兩塊,一塊是業務已經整理好各種特徵資料,我們需要去找出適合我們問題需要的特徵;另一塊是我們從業務特徵中自己去尋找高階資料特徵。我們就針對這兩部分來分別討論。 2. 特徵選擇的

機器學習特徵工程特徵預處理

特徵預處理是什麼? 通過特定的統計方法(數學方法)講資料轉換成演算法要求的資料。 數值型資料: 歸一化 標準化 缺失值 類別型資料:one-hot編碼 時間型別:時間的切分 特徵選擇的意義 在對資料進行異常值、缺失值、資料轉換等處理後,我們

【資料平臺】sklearn庫特徵工程特徵選擇和降維

1、特徵選擇 當資料預處理完成後,我們需要選擇有意義的特徵輸入機器學習的演算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特徵: 特徵是否發散:如果一個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。特徵與目標的相

不想累死就來看看 : 特徵工程特徵選擇

作者:劉建平           編輯:祝鑫泉       授權轉發自:劉建平《特徵工程之特徵選

特徵工程特徵選擇

特徵工程是資料分析中最耗時間和精力的一部分工作,它不像演算法和模型那樣是確定的步驟,更多是工程上的經驗和權衡。因此沒有統一的方法,這裡只是對一些常用的方法做一個總結。1. 特徵的來源    在做資料分析的時候,特徵的來源一般有兩塊,一塊是業務已經整理好各種特徵資料,我們需要去

面對各種資料怎麼處理 : 特徵工程特徵表達

 作者:劉建平            編輯:陳人和            授權轉發自:劉建平《特

資料探勘篇——特徵工程特徵降維

 在業界廣泛流傳著一句話:資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。  由此可見,資料和特徵是多麼的重要,而在資料大多數場景下,資料已經就緒,不同人對於同樣的資料處理得到的特徵卻千差萬別,最終得到的建模效果也是高低立現。從資料到特徵這就要從特徵工程說起了...

Alink漫談(九) :特徵工程 特徵雜湊/標準化縮放

# Alink漫談(九) :特徵工程之特徵雜湊/標準化縮放 [Toc] ## 0x00 摘要 Alink 是阿里巴巴基於實時計算引擎 Flink 研發的新一代機器學習演算法平臺,是業界首個同時支援批式演算法、流式演算法的機器學習平臺。本文將剖析Alink “特徵工程” 部分對應程式碼實現。 ## 0x

資料特徵工程量化裝箱

量化裝箱        假設這樣一個數據集,裡面某些屬性的值差異很大,小的可能是10以內,大至幾百幾千,這樣我們該如何去量化呢?直接將它們送入模型可行嗎?      &

特徵工程Histogram編碼

例如有如下的特徵,我們要對性別進行編碼,可能常用的方法就是男性對應0,女性對應1。 性別 分類標籤 男 0 男 1 男 1

特徵工程歸一化及標準化

特徵的預處理:對資料進行處理 特徵處理:通過特定的統計方法(數學方法)將資料轉換成演算法要求的資料   歸一化: 多個特徵同等重要的時候需要進行歸一化處理目的:使得某一個特徵對最終結果不會造成更大影響 歸一化API:   標準化:

【sklearn例項】4--特徵工程離散值編碼

離散特徵 離散特徵變數型別可以分為有序類和無序類。 無序類,價值相等且可區分,沒有等級、順序、排序、好壞等邏輯關係,各變數相互獨立:性別(男/女)、顏色(赤橙黃綠青藍紫)、登機口(A/B/C); 有序類:各變數有級別大小等邏輯關係:尺碼(L/XL/XXL)、學歷(高/中/低) 為何要

14.【進階】特徵提升特徵抽取----DictVectorizer

說明:DictVectorizer的處理物件是符號化(非數字化)的但是具有一定結構的特徵資料,如字典等,將符號轉成數字0/1表示。 #-*- coding:utf-8 -*- #學習目標:使用DictVectorizer對使用字典儲存的資料進行特徵抽取和

特徵工程類別特徵 處理方法介紹

當類別特徵仍保持原始形式時,其取值來自所有可能取值構成的集合而不是一個數字,故不能作為輸入。 當各個取值之間是沒有順序關係的並列關係,這樣的類別特徵稱為 名義(nominal)變數。相反,那些

機器學習(四)特徵工程以及特徵選擇的工程方法

關於特徵工程(Feature Engineering),已經是很古老很常見的話題了,坊間常說:“資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已”。由此可見,特徵工程在機器學習中佔有相當重要的地位。在實際應用當中,可以說特徵工程是機器學習成功的關鍵。縱觀

機器學習——特徵工程子集搜尋與評價

一、前言 1、特徵:描述目標物件的屬性 2、特徵型別     a) 相關特徵:對於當前學習任務有用的屬性,即與目標物件非常相關的特徵     b) 無關特徵:對於當前學習任務無用的屬性,即與目標物件無關的特徵     c) 冗餘特徵:其包含的資訊可通過其它特徵推演 3、特徵

【Machine Learning】特徵工程獨熱編碼(One-hot Encoding)

一、獨熱編碼         當我們在機器學習做特徵工程時,如果某個categorical特徵具有多個符號值,則不可能對具有這種特徵的資料進行訓練,而獨熱編碼是解決這個問題的一種方法。比如我們有一個特徵是protocol_type有三個值:tcp,udp,icmp,那麼我們