chapter 5 用轉換器抽取特徵(感覺有點特徵工程的意思)
本章所討論的是如何從數據集中抽取數值和類別型特徵,並選出最佳特徵。
特徵抽取
對於各個實物,我們只有先把現實用特徵表示出來,才能藉助數據挖掘的力量找到問題的答案。特徵選擇的另一個優點在於降低真實世界的複雜度。
dataframe中的unique函數有點類似於SQL中的distinct,能把一列中互不相同的元素篩選出來。
數據離散化:條件判斷,劃分。
特徵選擇
sklearn中的VarianceThreshold轉換器可用來刪除特徵值的方差達不到最低標準的特徵。
from sklearn.feature_selection import VarianceThreshold
vt = VarianceThreshold()
xt = vt.fit_transform(x)
輸出xt後,會發現不符合要求的列消失了。print(vt.variances_) #輸出每一列的方差
選擇最佳特徵
sklearn提供了幾個用於選擇單變量特徵的轉換器:
SelectKBest返回k個最佳特徵
SelectPercentile返回表現最佳的前r%個特徵
單個特徵和某一類別之間相關性的計算方法有很多。常用的有卡方檢驗、互信息、信息熵等。
使用SelectKBest轉換器類,用卡方函數打分
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
transformer = SelectKBest(score_func=chi2, k=3)
xt_chi2 = transformer.fit_transform(x, y)#對數據集進行預處理和轉換,結果爲分類效果較好的三個特徵
print(transformer.scores_)#打印每一列的相關性
PCA
from sklearn.decomposition import PCA
pca = PCA(n_components = 5)
xd = pca.fit_transform(x)
創建自己的轉換器
轉換器有兩個關鍵函數。
fit():接收訓練數據,設置內部函數。
transform():轉換過程。接收訓練數據集或相同格式的新數據集。
轉換器接收numpy數組作爲輸入,根據均值將其離散化。任何高於均值的特徵值替換爲1,小於或等於均值的替換爲0.
from sklearn.base import TransformerMixin
from sklearn.utils import as_float_array
class MeanDiscrete(TransformerMixin):
def fit(self, x):
x = as_float_array(x)
self.mean = x.mean(axis = 0)
return self
def transform(self, x):
x = as_float_array(x)
assert x.shape[1] == self.mean.shape[0]
return x > self.mean
chapter 6 使用樸素貝葉斯進行社會媒體挖掘
N元語法
比起用單個詞做特徵,使用N元語法能更好地描述文檔。N元語法是指由幾個連續的詞組成的子序列。拿本章用的數據集來講,N元語法指的就是每條消息裏一組連續的詞。
N元語法的計算方法跟計算單個詞語方法相同,把構成N元語法的幾個詞看成是詞袋中的一個詞。數據集中每一項就變成了N元語法在給定文檔中的詞頻。
比如,“厲害了我的國”,設N = 3,則這句話的3元語法爲,“厲害了”、“害了我”、“了我的”、“我的國”。
N元語法比起單個詞,可有助於理解詞語用法的上下文信息、有助於發現拼寫錯誤。它的缺點是特徵矩陣變得更爲稀疏。
當用流水線組合起來後,爲了得到模型,就用流水線的fit函數,創建模型。藉助流水線的named_steps屬性和步驟名,就能訪問流水線的每一個步驟。如,可訪問樸素貝葉斯模型。
model = pipeline.fit(x, y)
nb = model.named_steps['naive-bayes']