iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
0
AI & Data

大數據的世代需學會的幾件事系列 第 11

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

昨天介紹完超參數模型(Hyperparameters and Model Validation),今天要來介紹如何利用SKlearn實作特徵工程(Feature Engineering),並介紹一些常見的特徵工程範例,像是分類數據、文本、圖像。

分類特徵(Categorical Features)

一種常見類型的非數字數據是分類數據。例如,假設您正在探索一些有關房價的數據,以及“價格”和“房間數量”等數字特徵,甚至還可以獲得“鄰居”資料。下面一一介紹如何將數據依照類型分類:

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)

output

  • 查看vec每列的含義,可以檢查功能名稱:
vec.get_feature_names()

output

但這種方法有一個明顯的缺點:如果您的類別有許多可能的值,這可能會大大增加數據集的大小。

  • 將sparse更改為True,可以解決為稀疏矩陣的問題
vec = DictVectorizer(sparse=True, dtype=int)
vec.fit_transform(data)

output

文字特徵(Text Features)

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

from sklearn.feature_extraction.text import CountVectorizer

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

output

  • 輸出結果是一個稀疏矩陣記錄每個單詞出現的次數,如果將其轉換為帶有標記列的DataFrame,就可以更容易檢查
import pandas as pd
pd.DataFrame(X.toarray(), columns=vec.get_feature_names())

output

  • 這種方法存在一些問題:原始單詞計數會導致對於非常頻繁出現的單詞過於重視的特徵,並且在某些分類算法中這可能是次優的。
    文字頻率(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())

output

圖片特徵(Image 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);

output

  • 可以利用線性回歸(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);

output

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

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

output

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

output


上一篇
Day10-Scikit-learn介紹(2)
下一篇
Day12-Scikit-learn介紹(4)_ Bayes Classification
系列文
大數據的世代需學會的幾件事30

尚未有邦友留言

立即登入留言