2018/11/25

Machine learning, scikit-learn 簡介

03 Machine learning, scikit-learn簡介

Machine learning (機器學習, ML)

一般大致可分為:Supervised learning(監督式學習), Unsupervised learning(非監督式學習), Reinforcement learning (強化式式學習)三大分類。
  • Supervised learning:利用已有的資料進行訓練並測試,完成的模型用以預測未見過的資料。若用以預測離散型資料則稱分類(Classification), 若用以預測連續數值(如實數)則稱為回歸(Regression)。
  • Unsupervised learning:將已有的資料進行叢集化(Clustering),如何分成叢集和要分成幾個叢集是考量的重點。
  • Reinforcement learning: 學習個體(Agent)不斷的自我進行學習,當成功達某項目標系統給予一定的獎賞(Reward),學習個體最終可完成使命。
Machine learning 重要觀念:
  • 監督式學習將資料分成訓練集(Training set)和測試集(testing),訓練集用以調整系統的參數而測試集用以測試系統的性能。 一般以可用資料的3/4量為訓練集而1/4為測試集。資料集的每一筆資料稱為實例 (Instance),每一實例屬於某一標的 (target) 或類別(class),資料裡有很多特徵(feature), 此特徵就是資料的維度(Dimension)。
  • Curse of dimensionality (維度的魔咒):當系統參數的數目增加,系統學習的複雜度呈指數成長。
  • 當訓練的資料過多使得系統參數對訓練資料匹配非常良好,但當用測試資料測試時性能卻非常差,稱 Overfitting (過適配)。 當訓練資料不足或系統太簡單時,性能很差,稱Underfitting (欠適配)。
  • Data normalization (資料正規化):把資料的平均值調整為0而變異數調整為1。
  • Feature engineeribg (特徵工程):將資料進行必要的轉換,如把文字資料變成實數資料以利系統學習,為machine learning的一個次領域。

scikit-learn

引用時要寫成sklearn,為Python的外掛函式庫。構建於NumPy(陣列函式庫),SciPy(科學計算函式庫), matplotlib(2D/3D畫圖函式庫),IPython(加強的交互解釋器),Sympy(Symbolic mathematics), Pandas(數據結構和分析)之上,用於machine learning ,提供常用的ML演算法及資料 ,一些重要特性如下
  • 提供supervised learning (監督式學習)、 unsupervised learning 所需各式演算法。
  • Dimensionality Reduction, Feature extraction, Feature selection。
  • Cross Validation, Parameter Tuning, Manifold Learning
  • sklearn.datasets提供了乳腺癌、iris、加州房價等諸多開源的資料庫。
Simple linear regression 使用sklearn例子:
使用一組訓練集資料來產生回歸參數,用以預測尚未遇見的資料。本例使用利一組小小(Toy)的資料集來說明simple linear regression (簡單線性回歸)。資料集如下:

實例 大小 價格
1 6 7
2 8 9
3 10 13
4 14 17.5
5 18 18
在cell裡輸入下列程式
import numpy as np
import matplotlib.pyplot as plt
X = np.array([[6], [8], [10], [14], [18]])
y = [7, 9, 13, 17.5, 18]
plt.figure()
plt.title('Price against size')
plt.xlabel('Size')
plt.ylabel('Price')
plt.plot(X, y, 'k.')
plt.axis([0, 25, 0, 25])
plt.grid(True)
plt.show()
按ctrl-enter 兩次後可得下列圖表
簡單數據圖
上圖是利用matplotlib畫出的簡單圖表,程式中先輸入X,y數據,其中X是使用$(1\times 5)$的陣列,而y是python的list。程式中並叫用plt.figure()以 產生圖片,並指出標題及軸的範圍,畫點的產色('K.')指畫黑點,grid(true)指畫出格線,最後用show()秀圖。
有了上列資料後就可用sklearn進行學習,輸入下列程式
from sklearn.linear_model import LinearRegression
model = LinearRegression() 
model.fit(X, y)
test_obj = np.array([[12]])
predicted_price = model.predict(test_obj)
print('A 12" 大小價格是: %.2f' % predicted_price)
得A 12" 大小價格是: 13.68
此例中使用了scikit-learn 的 LinearRegression,以fit方法進行練,並用predict方法進行預測。此簡單線性回歸以給定的資料進行分析,並求得一直線,使此直線到給定的資料的平均距離最小。此直線為
$y=\alpha +\beta x $
我們可以使用 print(model.coef_) 及 print(model.intercept_)將參數列印出來,如以下可列印參數
print(model.coef_)
print(model.intercept_)
得輸出   [0.9762931]
              1.965517241379315
輸入下列程式可列印直線
X = np.array([[6], [8], [10], [14], [18]])
y = [7, 9, 13, 17.5, 18]
x1 = np.arange(26)
y1 = 1.9655+ 0.976 *x1
plt.figure()
plt.title('Price against size')
plt.xlabel('Size')
plt.ylabel('Price')
plt.plot(X, y, 'k.', x1,y1, 'r')
plt.axis([0, 25, 0, 25])
plt.grid(True)
plt.show()

列印直線

 進一步了解演算法

求$\alpha$及$\beta$的方法很多,這裡介紹一種用$x$(size)的平均值$\bar x$、變異數$\mbox{Var}(x)$、$y$(price)的平均值$\bar y$及$x$
和$y$的共變異數$\mbox{Cov}(x,y)$求解的方法。其中:

$
\mbox{Var}(x)=\frac{\sum_{i=1}^{n}\ \ (x_i-\bar x)^2}{n-1}
$

為$x$的變異數,且

$
\mbox{Cov}(x,y)=\frac{\sum_{i=1}^{n}\ (x_i-\bar x)(y_i-\bar y)}{n-1}
$

為$x$和$y$的共變異數。參數 $\beta$定義成

$
\beta=\frac{\mbox{Cov}(x,y)}{\mbox{Var}(x)}
$

而參數$\alpha$定義成

$
\alpha =\bar y- \beta \bar x
$

下列程式x的平均值和變異數
x_bar = X.mean()
print(x_bar)
variance = ((X - x_bar)**2).sum() / (X.shape[0] - 1)
print(variance)
顯示 11.2
         23.2
下列程式求y的平均值並用公式和np.cov 求 x,y之共變異數
y = np.array([7, 9, 13, 17.5, 18])
y_bar = y.mean()
covariance = np.multiply((X - x_bar).transpose(), y - y_bar).sum() /(X.shape[0] - 1)
print(covariance)
print(np.cov(X.transpose(), y)[0][1])
得   22.65
       22.650000000000002
其中cov().[0][1]表示取出第0列和第一行的元素,因共變異數落在矩陣的反斜角。之後可用上述公式求$\alpha$和 $\beta$,
beta = covariance / variance
alpha = y_bar - beta*x_bar
print(beta)
print(alpha)
得到和用model求出相似的結果。

用Cost function 評估適度性

 Cost function(成本函數)也稱用Lost function (損失函數)是用於定義量測的誤差,也就是量測所得的$\hat y$實資料裡的$y$值的差。此值可稱residuals(殘留)或 training error (訓練誤差)。模型建立好後以測試資料進行測試時所產生的誤差稱為prediction errors 或test errors。
RSS: residual sum of squares定義成$SS_{res}=\sum_{i=1}^{n}((y_i-f(x_i))^2)$,用於計算 R-squared。下列程式計算RSS,
print('Residual sum of squares: %.2f' % np.mean((model.predict(X - y) ** 2))
顯示 Residual sum of squares: 1.75
假設我們又取得一組關於物品價格的資料,則可以用來評估系統,資料集及系統預測的數字如下

實例 大小 價格 預測值
1 8 11 9.7759
2 9 8.5 10.7522
3 11 15 12.7048
4 16 18 17.5863
5 12 11 13.6811

這裡使用R-squared (又稱為coefficient of determination)來評估模型。首先定義total sum of squares

$
SS{tot}=\sum_{i=1}^{n} (y_i-\bar y)^2
$

R-squared的定義是

$
R^2=1-\frac{SS_{res}}{SS_{tot}}
$

scikit-learn 裡的score method可用來計算R-squared。
import numpy as np
from sklearn.linear_model import LinearRegression
X_train = np.array([6, 8, 10, 14, 18]).reshape(-1, 1)
y_train = [7, 9, 13, 17.5, 18]
X_test = np.array([8, 9, 11, 16, 12]).reshape(-1, 1)
y_test = [11, 8.5, 15, 18, 11]
model = LinearRegression()
model.fit(X_train, y_train)
r_squared = model.score(X_test, y_test)
print(r_squared )
執行程式顯示 0.6620052929422553
程式碼中的 reshape(-1, 1)是指不管列,將之重塑成一行。

沒有留言:

張貼留言