特徵提取之 DictVectorizer



特徵提取是計算機視覺和圖像處理中的一個概念。它指的是使用計算機提取圖像信息,決定每一個圖像的點是否屬於一個圖像特徵。特徵提取的結果是把圖像上的點分爲不一樣的子集,這些子集每每屬於孤立的點、連續的曲線或者連續的區域。用 Python 進行特徵提取的方法有不少,這裏我使用 sklearn.feature_extraction.DictVectorizer 這個類來進行特徵提取,畢竟新版本的 scikit-learn 在使用這個類的時候會遇到一些問題,在講怎麼用它進行特徵提取的同時順便把這些問題解決了。python



檢查版本算法



首先須要檢查 scikit-learn 的版本,個人版本是 0.21.3,如圖所示。
微信

檢查完版本以後就是講解怎麼使用 DictVectorizer 進行特徵提取。
app


用 DictVectorizer 進行特徵提取dom



雖然在開頭我解釋了特徵提取主要用於提取圖像數據的特徵,可是提取其餘類型數據的特徵也是時常會有的。今天講的 DictVectorizer 主要是用來提取字典數據的特徵,固然也能夠提取 DataFrame 格式的數據的特徵(老版本 scikit-learn 裏面的 DictVectorizer 應該或許能夠直接用來提取 DataFrame 格式的數據的特徵,畢竟我沒用過老版本的這個類,可是我敢肯定的是新版本須要作一些變換)。
機器學習

首先跟着老版本的模式先來一波,代碼以下:ide

from random import random
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
df = DataFrame({'X1': [random()for _ in range(100)], 'X2': [random()for _ in range(100)]})
X_train, X_test = train_test_split(df, random_state=0)
dv = DictVectorizer().fit_transform(X_train)

print(dv)函數


在這裏首先我是構造了一個隨機生成 100 條數據的數據集,其中每一個數據點有兩個特徵 X1 和 X2,沒有目標值,畢竟特徵提取和數據轉換屬於無監督學習的範疇。而後必然是拆分訓練集與測試集,接着用 DictVectorizer 對象的 fit_transform 方法對訓練集進行訓練並轉換,最後把轉換後的東西作一個輸出,這段代碼邏輯就是如此,並無特別複雜。知道了代碼邏輯以後就要運行代碼了,運行結果如圖所示。
學習

發現報錯,並且這個錯誤很是莫名其妙,光看報錯徹底不知道問題出在哪裏。看不出錯誤不要緊,咱們能夠去看看 scikit-learn 的文檔,或許是新版本的 scikit-learn 把 DictVectorizer 這個類的使用方法給改掉了,在文檔中咱們能夠發現這麼一個使用 DictVectorizer 的小例子,如圖所示。測試

咱們發現 fit_transform 方法裏面傳入的是一個字典列表格式的數據,而不是其餘格式的數據。這個字典列表格式的數據看起來很簡單,就是一個列表,其中的每一個元素是一個字典,字典鍵對應着特徵名,字典值對應着特徵值。DataFrame 格式的數據是一個表格,表格中每一行對應着一條數據,有多少行就有多少條數據,每一列對應着一個特徵,有多少列就有多少個特徵。知道了這些把 DataFrame 格式的數據轉換成字典列表格式的數據就是垂手可得的事情了,直接上代碼,以下所示:

from random import random
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
df = DataFrame({'X1': [random()for _ in range(100)], 'X2': [random()for _ in range(100)]})
X_train, X_test = train_test_split(df, random_state=0)
X_train = [{'X1': X_train['X1'][i], 'X2': X_train['X2'][i]}for i in range(75)]
dv = DictVectorizer().fit_transform(X_train)

print(dv)


一行代碼就完成了數據格式的轉換,這行代碼沒什麼難的,就是一個列表推導式。在這裏重點解釋一下 75 這個數字,75 意味着 X_train 裏面有 75 條數據(同時也暗示了 X_test 裏面有 25 條數據),至於爲何是 75 只要記得是 train_test_split 這個函數裏面默認規定的就好了。接下來仍是運行一下看看,運行結果如圖所示。

仍是報錯,更加莫名其妙,一樣也是看不出錯在了哪裏,咱們把那個列表推導式寫完整一些,每次循環的時候順便打印循環變量 i 的值,代碼以下:

from random import random
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
df = DataFrame({'X1': [random()for _ in range(100)], 'X2': [random()for _ in range(100)]})
X_train, X_test = train_test_split(df, random_state=0)
li = []
for i in range(75):
   print(i)
   li.append({'X1': X_train['X1'][i], 'X2': X_train['X2'][i]})
dv = DictVectorizer().fit_transform(X_train)

print(dv)


運行結果如圖所示。

確實發現循環變量 i 一旦變成 2 就會出錯,我目前敢確定個人方向是對的,就是數據格式須要作轉換,可是這裏確定有一些細節我沒注意。我首先猜想問題出在 X_train,先打印一下 X_train 看看,代碼以下:

from random import random
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
df = DataFrame({'X1': [random()for _ in range(100)], 'X2': [random()for _ in range(100)]})
X_train, X_test = train_test_split(df, random_state=0)
print(X_train)
li = []
for i in range(75):
   print(i)
   li.append({'X1': X_train['X1'][i], 'X2': X_train['X2'][i]})
dv = DictVectorizer().fit_transform(X_train)

print(dv)


運行結果如圖所示。

咱們能夠發現 X_train 最左邊有一列是一列無序的整數,這一列是索引列,索引無序而且有大於 75 的數,這說明了在 train_test_split 裏面進行訓練集測試集分離的過程當中是帶着原來的索引進行分離,分離以後並不會對索引進行更新,既然如此只須要對索引進行迭代就好了,代碼以下:

from random import random
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
df = DataFrame({'X1': [random()for _ in range(100)], 'X2': [random()for _ in range(100)]})
X_train, X_test = train_test_split(df, random_state=0)
X_train = [{'X1': X_train['X1'][i], 'X2': X_train['X2'][i]}for i in X_train.index]
dv = DictVectorizer().fit_transform(X_train)

print(dv)


運行結果如圖所示。

確實沒有報錯了,輸出結果看看就好,畢竟我瞎構造的數據沒有一點實際意義,若是還有報錯的能夠後臺回覆「加羣」,備註:小陳學Python,不備註但是會被拒絕的哦~!










本文分享自微信公衆號 - Python機器學習算法說書人(Python-ML-Algorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索