特徵工程的力量

數據科學家,會經常被複雜的機器學習技術所吸引。使用某些深度神經網絡(DNN)壓縮1%的額外精度並在此過程中必須啟動一個GPU實例,這使人非常滿意。但是,這些技術通常使您的想法落到計算機上,使我們對模型的工作方式瞭解甚少。所以,本文想回到基礎。

特徵工程的力量

在本文中,我希望教給您一些有關特徵工程的知識,以及如何使用它來對非線性決策邊界進行建模。我們將探討兩種技術的優缺點:邏輯迴歸(具有特徵工程)和NN分類器。將給出用於擬合這些模型以及可視化其決策邊界的Python代碼。您還可以在上找到完整的項目。最後,我希望讓您理解為什麼特徵工程可能是其他非線性建模技術的更好替代方案。

什麼是特徵工程

每當您從原始數據創建特徵或將現有特徵添加到數據集時,就在進行特徵工程。這通常是使用特定領域的領域知識完成的。例如,假設我們要預測一個人從手術中恢復所花費的時間。從以前的手術中,我們已經捕獲了患者的康復時間,身高和體重。根據這些數據,我們還可以計算每個患者的BMI =身高/體重²。通過計算BMI並將其包括在數據集中,我們正在進行特徵工程。



我們為什麼進行特徵工程

特徵工程功能強大,因為它允許我們將非線性問題重新表述為線性問題。為了說明這一點,假設恢復時間與身高和體重具有以下關係:

Y =β₀+β₁(height)+β2(weight)+β₃(height/weight²)+noise

從第三項來看,我們可以看到Y與身高和體重沒有線性關係。這意味著我們可能不會期望線性模型(例如線性迴歸)在估計β係數方面做得很好。您可以嘗試使用非線性模型(例如DNN),也可以通過進行一些特徵工程來幫助我們的模型。如果我們決定將BMI作為功能包括在內,則關係變為:

Y =β₀+β₁(height)+β2(weight)+β₃(BMI)+noise

現在可以將Y建模為3個變量的線性關係。結果,我們期望線性迴歸在估計係數方面做得更好。稍後,我們將看到相同的想法適用於分類問題。

為什麼不讓計算機來做

特徵工程從本質上講就是內核技巧,因為我們正在將特徵映射到更高的平面。儘管使用內核技巧,通常很少涉及到思想。內核函數被視為超參數,可以使用蠻力找到最佳函數-嘗試各種函數變化的負載。使用正確的內核函數,您可以為非線性關係建模。給定適當數量的隱藏層/節點,DNN還將自動構造特徵的非線性函數。那麼,如果這些方法可以對非線性關係進行建模,那麼為什麼還要打擾特徵工程呢?

上面我們解釋了特徵工程如何使我們即使使用線性模型也可以捕獲數據中的非線性關係。這意味著,根據問題,我們可以獲得與非線性模型相似的性能。在本文後面的部分中,我們將詳細介紹一個示例。除此之外,使用特徵工程還有其他好處,這使這項技術值得一試。

特徵工程的力量

首先,您將對模型的工作原理有更好的瞭解。這是因為您確切地知道模型用於進行預測的信息。此外,通過直接查看特徵係數,可以輕鬆地解釋邏輯迴歸等模型。第一個原因,即該模型更易於解釋。如果您在行業中工作,這尤其重要。您的同事更有可能會接觸到更簡單的模型。第三個原因是您的模型不太適合訓練數據。通過對不同超參數的強行加載,很容易最終在數據中建模噪聲。相比之下,具有經過深思熟慮的特徵,您的模型將是直觀的,並且可能會模型化真實的潛在趨勢。



數據集

讓我們深入一個實際的例子。為了使內容儘可能清晰,將使用人工生成的數據集。為避免該示例過於沉悶,我們將圍繞它創建一個敘述。因此,假設您的人事部門要求您創建一個模型,該模型可以預測是否會升職。該模型應考慮員工的年齡和績效得分。

我們在下面的代碼中為2000名假設的員工創建特徵。員工的年齡可以在18至60歲之間。績效得分可以在-10至10之間(最高為10分)。兩種特徵都經過混洗,因此它們之間沒有關聯。然後,我們使用年齡(a)和績效(p)的以下函數來生成目標變量:

γ(a,p)= 100(a)+ 200(p)+ 500(a / p)-10000 + 500(noise)

當γ(a,p)≥0時,則晉升員工;當γ(a,p)<0時,則不晉升員工。我們可以看到術語a / p包含在上面的函數中。這意味著決策邊界將不是年齡和績效的線性函數。還包括隨機噪聲,因此數據無法完全分離。換句話說,模型不可能是100%準確的。

<code>import numpy as np 
import pandas as pd
n_points = 2000
age = np.round(np.linspace(18,60,n_points),2) #age of employee
np.random.shuffle(age)
performance = np.linspace(-10,10,n_points) #performance score of employee
np.random.shuffle(performance)
noise = np.random.randn(n_points)
g = (100*age) +200*(performance) + 500*age/performance -10000 + 500*noise
y = [1 if y>=0 else 0 for y in g]
data = pd.DataFrame(data={'age':age,'performance':performance,'y':y})/<code>

如果上面的步驟有點混亂,請不要擔心。通過使用以下代碼可視化數據集,我們可以使事情更清晰。在這裡,我們創建了數據的散點圖,結果如圖1所示。只有兩個功能,可以很容易地準確瞭解正在發生的事情。在y軸上,我們擁有員工的績效得分,在x軸上,我們擁有員工的年齡。晉升員工的分數為紅色,未晉升員工的分數為藍色。最後,在2000名員工中,有459名(佔23%)獲得了晉升。對於不同的隨機樣本,此比率將略有變化。

<code>import matplotlib.pyplot as plt 
%matplotlib inline

plt.subplots(nrows=1, ncols=1,figsize=(15,10))
plt.scatter('age','performance',c='#ff2121',data=data[data.y == 1])
plt.scatter('age','performance',c='#2176ff',data=data[data.y == 0])
plt.ylabel("Performance Score",size=20)
plt.xlabel('Age',size=20)
plt.yticks(size=12)
plt.xticks(size=12)
plt.legend(['Promoted','Not Promoted'],loc =2,prop={"size":20})/<code>
特徵工程的力量

圖1:促銷數據的散點圖

儘管生成了這些數據,但我們仍然可以對圖進行實際說明。在圖1中,我們可以看到3個不同的僱員組。第一個是績效得分低於0的組。由於績效不佳,這些員工中的大多數沒有得到晉升,我們也可以期望其中的一些人被解僱。我們可以期望得分高於0的員工獲得升職或接受其他職位。得分特別高的員工傾向於離職。這可能是因為它們的需求量很大,並且在其他地方收到了更好的報價。但是,隨著僱主的年齡增長,他們需要更高的績效分數才能離職。這可能是因為年長的員工更願意擔任目前的職位。

無論哪種敘述,很明顯決策邊界不是線性的。換句話說,不可能畫出一條直線來很好地區分被提升和未被提升的群體。結果,我們不會期望線性模型做得很好。讓我們通過僅使用年齡和績效這兩個特徵來擬合邏輯迴歸模型來證明這一點。

邏輯迴歸

在下面的代碼中,我們將2000名員工分為訓練集(70%)和測試集(30%)。我們使用訓練集來訓練邏輯迴歸模型。然後,使用該模型,對測試集進行預測。測試儀的準確性為82%。這看起來似乎還不錯,但是我們應該考慮不到23%的員工獲得了晉升。因此,如果我們只是猜測沒有一個員工會獲得升職,那麼我們應該期望其準確性約為77%。

<code>from sklearn.model_selection import train_test_split 
import sklearn.metrics as metric
import statsmodels.api as sm
x = data[['age','performance']]
x = sm.add_constant(x)
y = data['y']
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3, random_state=101)
model = sm.Logit(y_train,x_train).fit() #fit logistic regression model
predictions = np.around(model.predict(x_test))
accuracy = metric.accuracy_score(y_test,predictions)/<code>

通過使用以下代碼可視化模型的決策邊界,我們可以更好地瞭解模型的特徵。在這裡,我們在樣本空間內生成一百萬個點。然後,我們使用邏輯迴歸模型對所有這些點進行預測。像圖1中的散點圖一樣,我們可以繪製每個點。每個點的顏色由模型的預測確定-如果模型預測升級,則為粉紅色,否則為淺藍色。這使我們可以很好地近似決策邊界,如圖2所示。然後,我們可以在這些點上繪製實際數據集。

<code>n_points = 1000000 #use many point to visualise decision boundry 
age_db = np.linspace(18,60,n_points)
np.random.shuffle(age_db)
performance_db= np.linspace(-10,10,n_points)
np.random.shuffle(performance_db)
data_db = pd.DataFrame({'age':age_db,'performance':performance_db})
data_db = sm.add_constant(data_db)
#make predictions on the decision boundry points
predictions = model.predict(data_db)
y_db = [round(p) for p in predictions]
data_db['y'] = y_db
fig, ax = plt.subplots( nrows=1, ncols=1,figsize=(15,10))
#Plot decision boundry
plt.scatter('age','performance',c='#ffbdbd',s=1,data=data_db[data_db.y == 1])
plt.scatter('age','performance',c='#b0c4ff',s=1,data=data_db[data_db.y == 0])
#Plot employee data points
plt.scatter('age','performance',c='#ff2121',data=data[data.y == 1])
plt.scatter('age','performance',c='#2176ff',data=data[data.y == 0])
plt.ylabel("Performance Score",size=20)
plt.xlabel('Age',size=20)
plt.yticks(size=12)
plt.xticks(size=12)/<code>

查看決策邊界,我們可以看到模型做得很糟糕。它預測有晉升的員工中大約有一半沒有晉升。然後,對於大多數獲得晉升的員工,它預測他們沒有獲得晉升。注意,決策邊界是一條直線。這強調邏輯迴歸是線性分類器。換句話說,模型只能構造一個決策邊界,該邊界是您提供的要素的線性函數。在這一點上,我們可能很想嘗試其他模型,但讓我們看看是否可以使用特徵工程來提高性能。

特徵工程的力量

圖2:Logistic迴歸模型的決策邊界



用於特徵工程的邏輯迴歸

首先,如下面的代碼所示,我們添加了其他特徵(即年齡與性能的比率)。從那時起,我們將遵循與先前模型相同的過程。火車測試拆分與我們為" random_state"使用相同的值相同。最終,該模型實現了98%的準確度,這是一個重大改進。

該模型仍然只需要員工的年齡和績效即可做出預測。這是因為附加功能是年齡和性能的函數。這使我們能夠像以前一樣可視化決策邊界。那就是通過在樣本空間中每個年齡表現點使用模型的預測。我們可以看到,在圖3中,通過添加附加特徵,邏輯迴歸模型能夠對非線性決策邊界進行建模。從技術上講,這是年齡和性能的非線性函數,但仍是所有3個特徵的線性函數。

特徵工程的力量

圖3:具有特徵工程的Logistic迴歸模型的決策邊界

使用邏輯迴歸的另一個好處是該模型是可以解釋的。這意味著該模型可以用人類的術語來解釋。換句話說,我們可以直接查看模型係數以瞭解其工作原理。我們可以在表1中看到模型特徵的係數以及它們的p值。我們不會詳細介紹,但是係數允許您根據獲得的幾率的變化來解釋特徵的變化。促銷。如果某個特徵的係數為正,則該特徵值的增加會導致獲得晉升的幾率增加。

特徵工程的力量

表1:Logistic迴歸模型摘要

從表1可以看出,隨著年齡的增長,晉升的可能性也會增加。另一方面,對於性能而言,這種關係並不明確。績效的提高也會降低年齡/績效比率。這意味著績效提高的效果取決於員工的年齡。這非常直觀,因為它與我們在散點圖中看到的一致。在這種情況下,可能沒有必要使用係數來以此方式解釋模型。僅可視化決策邊界就足夠了,但是隨著功能數量的增加,執行此操作變得更加困難。在這種情況下,模型係數是瞭解模型工作原理的絕佳工具。

同樣,p值可以幫助我們理解模型。由於係數是統計估計值,因此它們周圍存在一些不確定性。低p值使我們可以確定我們的係數不同於0。換句話說,我們可以確定係數為正或負。這很重要,因為如果我們不確定係數的符號,就很難用幾率的變化來解釋特徵的變化。從表1可以看出,所有係數在統計上都是顯著的。這並不奇怪,因為我們使用功能的功能生成了數據。

總的來說,當我們生成數據時,上面的分析非常簡單。因為我們知道使用了什麼函數來生成數據,所以很明顯,附加特徵將提高模型的準確性。實際上,這不是那麼簡單。如果您對數據沒有很好的瞭解,則可能需要與人事部門的人員交談。他們也許能夠將過去所看到的任何趨勢通知您。否則,通過使用各種圖表和彙總統計數據探索該數據,您可以瞭解哪些特徵可能很重要。但是,假設我們不想做所有這些艱苦的工作。

神經網絡

為了進行比較,讓我們使用非線性模型。在下面的代碼中,我們使用Keras擬合神經網絡。我們僅使用年齡和性能作為特徵,因此NN的輸入層的尺寸為2。有2個隱藏層,分別具有20和15個節點。兩個隱藏層均具有relu激活功能,輸出層具有S型激活功能。要訓​​練模型,我們使用10和100個紀元的批量。訓練集大小為1400,這使我們有14000步。最後,該模型在測試集上達到了98%的精度。這與邏輯迴歸模型的準確性相同,但是我們不必進行任何特徵工程。

查看圖4中的NN決策邊界,我們可以看到為什麼將其視為非線性分類算法。即使我們只給出了模型的年齡和性能,它仍然能夠構造非線性決策邊界。因此,該模型在一定程度上為我們做了艱苦的工作。您可以說模型的隱藏層已自動完成要素工程。然後,考慮到該模型具有很高的準確性,並且我們需要較少的工作,為什麼還要考慮邏輯迴歸呢?

特徵工程的力量

圖4:神經網絡的決策邊界

NN的缺點是隻能解釋。這意味著,與邏輯迴歸不同,我們無法直接查看模型的參數以查看其工作原理。我們可以使用其他方法,但是最終,要理解NN的工作原理更加困難。向非技術人員解釋這一點更加困難。這使得邏輯迴歸模型在行業環境中的價值更大。

工業界和學術界都存在許多問題,而且大多數問題都比本文中給出的示例更為複雜。所提出的方法顯然不是所有這些問題的最佳解決方案。例如,如果您要進行圖像識別,那麼Logistic迴歸將無濟於事。對於更簡單的問題,通常只需要邏輯迴歸和對數據的充分理解。



分享到:


相關文章: