【scikit-learn】3、特徵提取
阿新 • • 發佈:2021-04-23
從類別變數中提取特徵
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、模型需要更多的訓練資料以確保有足夠多由特徵值組成的訓練例項