機器視覺之資料的特徵工程
前言:
隨著人工智慧的不斷髮展,機器學習這門技術也越來越重要,本文就介紹了機器學習的基礎內容。本章主要講如何對用於機器學習的資料進行特徵工程,特徵工程具體包括特徵抽取、特徵預處理、資料降維等過程。之後我會陸續釋出關於機器學習和深度學習相關的內容,大家可以關注下面的機器人基地公眾號,會有很多很有趣的內容哈哈。
提示:以下是本篇文章正文內容,下面案例可供參考
簡單介紹:機器學習是什麼,為什麼要對資料的特徵進行特徵工程?
通俗來講,機器學習是一門通過程式設計讓計算機從資料中進行學習的科學,同時也是一種藝術。
嚴格上來說,進行機器學習的模型訓練,一般會使用真實資料進行實驗,而不僅僅是人工資料集。而對於一些真實的資料集,資料的內容一般為文字、字串或圖片等等一些不能直接用於計算的資料,所以要對這些比較特殊的資料進行轉換,轉換為資料(進行特徵值化,為了讓計算機更好的去理解資料),下文講的是針對字典資料,陣列資料,文字資料進行的特徵工程處理,其中使用sklearn機器學習庫可以很好的對資料進行一系列操作。
流行的開放資料儲存庫
這裡提供一些資料庫,小夥伴們可以自行去其網站獲取自己想要的資料,具體網站如下:
http://archive.ics.uci.edu/ml/
http://www.kaggle.com/datasets/
http:aws.amazon.com/fr/datasets/
一、特徵抽取
特徵抽取API:sklearn.feature_extraction
1.使用sklearn對字典資料進行特徵值化
字典資料抽取實際上就是把字典中一些類別資料,分別進行轉換成特徵,特徵值化之後返回的是sparse矩陣。
類: sklearn.feature_extraction.DictVectorizer(sparse=False/ture)
方法:
DictVectorizer.fit_trabsform(X) #X:字典或者保護字典的迭代器,返回值為sparse矩陣 (即把一個字典的資料轉換為一個數據)
DictVectorizer.inverse_trabsform(X) #X:array資料或者sparse矩陣,返回值為轉換之前的資料格式
DictVectorizer.get_feature_name()# 返回類別名稱
DictVectorizer.trabsform(X) # 按照原先的標準轉換
程式碼如下(示例):
def dictvec():
#字典資料抽取
dict = DictVectorizer()#類物件示例化,括號裡的sparse=False/ture的值就決定了返回的轉換後的資料為陣列還是矩陣
#呼叫物件方法,引數為字典
data=dict.fit_transform([{'city':'北京','temperature':100}, {'city':'上海','temperature':60}, {'city':'深圳','temperature':40}]) #data 就是把字典轉換後的資料
print(data)
print(dict.get_feature_name())
return None
if __name__=="__main__":
//呼叫dictvec()
dictvec()
執行結構如下:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60]
[ 0. 0. 1. 40.]]
通過上面的結果可以看到:矩陣的每一行的資料就代表著字典資料,這樣就可以很好的把字典資料進行特徵抽取。
2.對陣列資料進行特徵值化
有了字典特徵值化的前車之鑑,對於陣列類的資料的處理也是大同小異,這裡也不進行過多的講解。
具體的抽取過程:先要轉換為字典資料,再對字典資料進行特徵轉換。
3.對文字資料進行特徵值化
對文字進行特徵值化的具體原理為:統計文章中所有的詞,在詞的列表裡面統計每個詞出現的次數,特徵目錄重複的詞只看作一次,單個字母不統計。
類 :sklearn.feature_extraction.text.CountVectorizer(sparse=False/ture)
程式碼如下(示例):
from sklearn.feature_extraction import CountVectorizer
def dictvec():
#對文字進行特徵值化
cv = CountVectorizer()#括號裡可有引數sparse=False/ture的值就決定了返回的轉換後的資料為陣列還是矩陣
#呼叫物件方法
data=cv.fit_transform(["gkjdsjdajsd","jklfjakfjakj"]
print(data) #這個的結果是一個sparse矩陣
print(dict.get_feature_name())#生成一個特徵目錄,詞的列表
print(data.toarry())#把一個sparse矩陣轉換為一個數組
return None
if __name__=="__main__":
//呼叫dictvec()
dictvec()
二、特徵預處理
雖上面進行了資料的特徵值化,但抽取處理的資料太過粗糙,根本就不能用來進行模型訓練或訓練效果非常差。所以要對抽取出來的資料進行資料特徵的預處理。因為機器學習的底層環境就是數學,一些不符合規範的資料格式是不能直接用於數學計算的,進行特徵預處理就是將資料轉換成演算法要求的資料。對於訓練的資料,本身大多是數值型資料,或經過特徵抽取得到的資料也是數值型的資料,這裡主要介紹對數值型資料和類別型的資料進行特徵預處理。
1.數值型資料:標準縮放(歸一化、標準化、缺失值)
1.歸一化
所謂的資料歸一化處理,即對原始資料進行變換把資料對映到(預設[0,1])之間,他們的相互對映有一一對應的關係。
公式如下:
注:作用於每一列。max為一列的最大值,min為一列的最小值,那麼X2為最終的結果,mx,mi分別為指定區間預設值mx為1,mi為0
歸一化API:sklearn.preprocessing.MinMaxScaler
處理步驟為:
1.MinMaxScaler(feature_range=(0,1)…) #每個特徵縮放到給定範圍(預設0,1)
2.MinMaxScaler.fit_transform(X)
X:numpy arry格式的資料[n_samples,n_features]
返回值:轉換後的形狀相同的array
程式碼如下(示例):
from sklearn.preprocessing import MinMaxScaler
def mm():
mm=MinMaxScaler(feature_range=(0,1) )
data=mm.fit_transform([[90,2,10,40],[90,2,10,40],[90,2,10,40],[90,2,10,40]])
print(data)
return None
if __name__=="__main__":
mm()
2.標準化
在多指標評價體系中,由於各評價指標的性質不同,通常具有不同的量綱和數量級。當各指標間的水平相差很大時,如果直接用原始指標值進行分析,就會突出數值較高的指標在綜合分析中的作用,相對削弱數值水平較低指標的作用。因此,為了保證結果的可靠性,需要對原始指標資料進行標準化處理。
資料的標準化處理就是將對原始資料進行變換到均值為0,方差為1範圍內,從而削弱高指標資料的對訓練模型的影響。
公式如下:
注:作用於每一列,mean為平均值,u為標準差
類:sklearn.preprocessing.StandardScaler
2.標準化API:示例化:StandardScaler(…) #處理之後每列來說所有的資料聚集在均值0附近方差為1
1.StandardScaler.fit_transfom(x) #進行標準化
x:numpy array格式的資料[n_samples,n_features]# 返回值:轉換後的形狀相同的array
2.StandardScaler.mean()#原始資料中每列特徵的平均值
3.StandardScaler.std()#原始資料每列特徵的方差
程式碼如下(示例):
from sklearn.preprocessing import StandardScalerr
def mm():
std=StandardScaler
data=std.fit_transfom([[90,2,10,40],[90,2,10,40],[90,2,10,40],[90,2,10,40]])
print(data)
return None
if __name__=="__main__":
mm()
3.對資料缺失值的處理
一般得到的資料集,比如類別資料集或預測房價資料集,資料集內的資料會因為某些原因有缺失,而對於缺失的資料,直接進行訓練會降低模型準確性,對資料缺失值的處理一般有以下兩種:
1.對缺失值刪除:如果每列或者行資料缺失值達到一定的比例,建議放棄整行或整列
2.對缺失值插補:可以通過缺失值每行或者每列的平均值、中位數來填充
對應的API:
1.Imputer(missing_values=‘NaN’,strategy=‘mean’,axis=0) #完成缺失值插補
missing_values:指定缺失值的位置
strategy:填補的方法:平均值還是中位數
axis:指定用缺失值的行或列來進行填補
2.Imputer.fit_transform(X) #呼叫函式完成填補
X:numpy arry:格式的資料[n_samples,n_features]
返回值:轉換後的形狀相同array
程式碼如下(示例):
from sklearn.preprocessing import Imputer
import numpy as np
def im():
im=Imputer(missing_values='NaN',strategy='mean',axis=0)
data=im.fit_transfom([[1,2],[np.nan,3],[7,6]])
print(data)
return None
if __name__=="__main__":
mm()
2.類別型資料
對於類別型資料的特徵預處理,因為類別型資料包含的資料量不是很多,只有特徵值和目標值,具體的特徵預處理的過程比較簡單。
具體的過程如下:
1.進行one-hot編碼(one-hot編碼具體內容這裡不進行詳解)
2.把類別型資料轉換為以字典
3.對字典資料進行特徵抽取
三、資料降維處理
資料的維度即資料的特徵的數量,一些沒有經過處理的資料集,一般會包含大量的無用的資料特徵,或對資料集影響較小的資料特徵。
對資料的特徵的降維處理即把特徵的數量減少,把一些對結果影響不大的特徵進行捨去,進行資料降維處理後,特徵數量減少,在最大程度上把資料集的利用效率最大化,還會提高模型的訓練速度。
1.進行特徵選擇:
在對資料進行降維處理之前,要對捨去的資料進行選擇,一般選取捨去資料的原則是:
冗餘:部分特徵的相關度低,容易消耗計算機效能;噪聲:部分特徵對預測結果有影響
主要方法:
(1)Filter(過濾式):VarianceThreshold;Embedded(嵌入式):正則化、決策樹;Wrapper(包裹式)。
(2)PCA主成分分析
這裡主要使用方法1和方法2,神經網路之後我會在下面的章節中詳解。
方法1:Filter(過濾式):VarianceThreshold
基本原理是:根據方差的大小進行過濾,刪除所有低方差(低於一個閾值)的特徵。
類:sklearn.feature_selection.VarianceThreshole
API:
VarianceThreshole(threshold=0.0) #threshold=0.0為想要刪除得方差得大小
方法:
VarianceThreshole.fit_transform(X)
X:numpy array格式的資料[n_samples,n_features]
返回值:訓練集差異低於threshold的特徵將被刪除。預設值是保留所有非零方差特徵,即刪除所有樣本中具有相同值得特徵。
程式碼如下(示例):
from sklearn.feature_sekection import VarianceThreshold
import numpy as np
def var():
var=VarianceThreshole(threshold=0.0)
data=var.fit_transfom([[0,2,0,3],[0,1,4,3],[0,1,1,3]])
print(data)
return None
if __name__=="__main__":
var()
方法2:PCA主成分分析
當特徵數量達到上百時,採用這一個方法對資料進行降維處理的效果就會比較好,PCA主要對資料維數壓縮,儘可能降低原資料的維數(複雜度),只損失少量資訊,可以削減迴歸分析或聚類 分析中特徵得數量。
類:sklearn.decomposition.PCA
API:PCA(n_components=None) #將資料分解為較低維數空間(n_components為小數時人為可控指定保留特徵數量的佔比,即90%時,指定保留90%的資訊;為整數時人為指定保留多少個特徵數量)
方法:
PCA.fit_transform(X)
X:numpy array格式的資料[n_samples,n_features]
返回值:轉換後指定維度的array
程式碼如下(示例):
from sklearn.decomposition import PCA
def pca():
pca=PCA(n_components=0.9)
data=pca.fit_transfom([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
return None
if __name__=="__main__":
pca()
至此,資料的特徵工程就算完成了,這一步非常重要,在之後的模型訓練中起到很關鍵的作用。
總結
這裡對文章進行總結:
以上就是今天要講的內容,本文僅僅簡單介紹了資料的特徵工程,而scikit-learn提供了大量能使我們快速便捷地處理資料的函式和方法,當然,資料的特徵工程還有其他很多的方法,可以自己去挖掘,畢竟,IT任重而道遠。以上的內容如果有什麼講不對的地方歡迎大家指出,而後我將會繼續進行釋出更多關於機器學習和深度學習的知識,如果覺得有用,歡迎大家關注下面的機器人基地公眾號。