iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 4
0
Google Developers Machine Learning

成為機器學習的王者系列 第 4

Day4 機器學習-特徵工程(資料過濾)

回顧一下機器學習的流程,昨天詳細講解完機器學習的前處理,今天要來介紹機器學習中的特徵工程(Feature Engineering)。

為什麼要做特徵工程呢?

特徵工程我們把他分為兩大類,第一類是資料清理,第二類是特徵過濾(資料降維):

資料清理

除了昨天講解的資料缺失值、異常值清理,還有會依照資料屬性像是分類數據、文本、圖像進行處理。

分類數據(Categorical Features)

一種常見類型的非數字數據是分類數據,可以利用One-Hot EncodingLabel Encoding的方式,以房價數據為例:

data = [{'price': 850000, 'rooms': 4, 'neighborhood': 'Queen Anne'},
        {'price': 700000, 'rooms': 3, 'neighborhood': 'Fremont'},
        {'price': 650000, 'rooms': 3, 'neighborhood': 'Wallingford'},
        {'price': 600000, 'rooms': 2, 'neighborhood': 'Fremont'}]

利用one-hot encoding編碼的方式,可以有效率的判斷所指示值為1或0代表存在或不存在。

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False, dtype=int)
vec.fit_transform(data)

文字特徵(Text Features)

將一份具有代表性的文本,轉換為一組有代表性的數值。例如,挖掘社交軟體的數據,將挖掘到的資料透過單詞計數轉換為數值,計算其中每個單詞的出現次數,並將結果放在表格中。

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

vec = CountVectorizer()
X = vec.fit_transform(sample)

pd.DataFrame(X.toarray(), columns=vec.get_feature_names())

輸出結果是一個稀疏矩陣記錄每個單詞出現的次數:

這種方法存在一些問題:原始單詞計數會導致對於非常頻繁出現的單詞過於重視的特徵,並且在某些分類算法中結果可能會比較不好。
文字頻率(term frequency-inverse document frequency,TF-IDF),可以通過衡量它們在文檔中出現的頻率來對字數進行加權。

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(sample)
pd.DataFrame(X.toarray(), columns=vec.get_feature_names())

圖片特徵(Image Features)

機器學習分析的資料不局限於數據資料,還需分析影像資料集,常見的影像特徵處理Derived Features

Derived Features

當我們從輸入數據構造多項式特徵時,我們在超參數和模型驗證中看到了,線性回歸直接轉換為多項式回歸中,不是通過分類來改變模型,而是通過轉換輸入,這種方式稱為「基函數回歸(basis function regression)」。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5])
y = np.array([4, 2, 1, 3, 7])
plt.scatter(x, y);

可以利用線性回歸(LinearRegression)的方式,將數據擬合至一條直線。

from sklearn.linear_model import LinearRegression
X = x[:, np.newaxis]
model = LinearRegression().fit(X, y)
yfit = model.predict(X)
plt.scatter(x, y)
plt.plot(x, yfit);

從上方的輸出結果中,可以看到我們需要更有效的方式來運算x和y的關係。

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
X2 = poly.fit_transform(X)
print(X2)

model = LinearRegression().fit(X2, y)
yfit = model.predict(X2)
plt.scatter(x, y)
plt.plot(x, yfit);

資料降維

簡單來說,蒐集到的資料屬性多,不一定每一項資料都會影響資料的預測結果,因此,我們對對原始資料進行一系列特徵工程處理,將每一屬性(欄位)提煉為特徵,作為輸入供演算法和模型使用,以加強機器學習模型訓練。

明日主題:機器學習-特徵工程(資料降維)

參考資料

  1. 特徵工程之資料預處理(上)

https://www.itread01.com/hkhkqpye.html

2.Day11-Scikit-learn介紹(3)_Feature Engineering

https://ithelp.ithome.com.tw/articles/10205475

本日心得

近日天氣秋風涼爽,小妹我是口琴手,後天樂團要公演,要來先趕進度惹/images/emoticon/emoticon02.gif/images/emoticon/emoticon02.gif/images/emoticon/emoticon02.gif


上一篇
Day3 機器學習-資料正規化、標準化
下一篇
Day5 機器學習-Bayes Classification
系列文
成為機器學習的王者7

尚未有邦友留言

立即登入留言