1. 程式人生 > 其它 >【scikit-learn】3、特徵提取

【scikit-learn】3、特徵提取

從類別變數中提取特徵

DictVectorizer 類是一個可以對類別特徵進行one-hot編碼的轉換器

from sklearn.feature_extraction import DictVectorizer
onehot_encoder = DictVectorizer()

X = [
    {'city': 'New York'},
    {'city': 'San Francisco'},
    {'city': 'Chapel Hill'}
]

print(onehot_encoder.fit_transform(X).toarray())

特徵標準化

標準化資料有零平均值和單位方差。零平均值解釋變數相對於原點居中。

當特徵向量所有特徵的方差處於相同量級,則擁有單位方差。

如果一個特徵的方差和其他特徵的方差相差太大的數量級,該特徵會控制學習演算法,阻止演算法從其他變數中學習。

preprocessing模組中的scale也可以用於單獨對資料集的任何軸進行任何標準化

from sklearn import preprocessing
import numpy as np
X = np.array([
    [0., 0., 5., 13., 9., 1.],
    [0., 0., 13., 15., 10., 15.],
    [0., 3., 15., 2., 0., 11.]
])
print(preprocessing.
scale(X))

豎著標準化

[[ 0.         -0.70710678 -1.38873015  0.52489066  0.59299945 -1.35873244]
 [ 0.         -0.70710678  0.46291005  0.87481777  0.81537425  1.01904933]
 [ 0.          1.41421356  0.9258201  -1.39970842 -1.4083737   0.33968311]]

從文字中提取特徵

詞帶模型

詞帶模型不會編碼任何文字句法,同時忽視單詞的順序,忽略所有的語法。

詞帶模型模型可以被看作是one-hot編碼的一種擴充套件,它會對文字中關注的每一個單詞建立一個特徵。

組成一個特徵向量的元素數量稱為向量的維度

預設情況下,CountVectorizer 把文件中的字元轉換為小寫,並對文件進行詞彙劃分。詞彙劃分是一個將字串切分為標誌或者有意義的字元序列的過程。

CountVectorizer 使用一個正則表示式將字串用空格分開,並提取長度大於等於兩個字元的字元序列進行切分。

corpus = [
    'UNC played Duke in basketball',
    'Duke lost the basketball game',
]

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
print(vectorizer.fit_transform(corpus).todense())
print(vectorizer.vocabulary_)

corpus.append('I ate a sandwich')
print(vectorizer.fit_transform(corpus).todense())
print(vectorizer.vocabulary_)
[[1 1 0 1 0 1 0 1]
 [1 1 1 0 1 0 1 0]]
{'unc': 7, 'played': 5, 'duke': 1, 'in': 3, 'basketball': 0, 'lost': 4, 'the': 6, 'game': 2}
[[0 1 1 0 1 0 1 0 0 1]
 [0 1 1 1 0 1 0 0 1 0]
 [1 0 0 0 0 0 0 1 0 0]]
{'unc': 9, 'played': 6, 'duke': 2, 'in': 4, 'basketball': 1, 'lost': 5, 'the': 8, 'game': 3, 'ate': 0, 'sandwich': 7}

我們使用歐幾里得距離來衡量不同特徵向量的差異性,等於兩個向量差值的歐幾里得範數
在這裡插入圖片描述
在這裡插入圖片描述

vectorizer.fit_transform(corpus).todense()
from sklearn.metrics.pairwise import euclidean_distances
X = vectorizer.fit_transform(corpus).todense()
print(euclidean_distances(X[0], X[1]))
print(euclidean_distances(X[0], X[2]))
print(euclidean_distances(X[1], X[2]))
[[2.44948974]]
[[2.64575131]]
[[2.64575131]]

維度詛咒:
1、高緯度向量需要更多的記憶體和計算能力
2、模型需要更多的訓練資料以確保有足夠多由特徵值組成的訓練例項