簡單線性回歸、邏輯回歸和泰坦尼克號的生存預測
一、機器學習入門:簡單線性回歸
1. 機器學習的步驟
提出問題 → 理解數據 → 數據清洗 → 構建模型 → 評估
2. 機器學習的特徵和標籤
輸入特徵 → 輸出標籤
① 特徵
特徵是數據的屬性,又稱自變數。
② 標籤
標籤是數據的預測結果,又稱因變數。
3. Python機器學習庫——scikit-learn
# 使用anaconda安裝scikit-learn包conda install scikit-learn# 導入scikit-learn包import sklearn
4. 簡單線性回歸
① 協方差
若cov(X, Y) > 0,則X與Y呈正線性相關;若cov(X, Y) < 0,則X與Y呈負線性相關。
協方差的缺點: 變數的變化幅度對協方差存在很大的影響。例如:第1組點(100, -50), (50, -50)與第2組點(1, -50), (50, -50),可以計算出第1組點的協方差為3750,第2組點的協方差為1275,而兩組點只有第一個點的橫坐標不同,其餘均相同,這對於判斷兩組點的相關性哪個更大的問題上具有嚴重的影響。
② 相皮爾遜積矩相關係數
仍以協方差的缺點中的例子為例,兩組點的相關係數均為1。
③ 協方差與相關係數的關係
相關係數是標準化後的協方差。相關係數消除了兩個變數變化幅度的影響,只反映兩個變數每單位變化的相關程度。
④ 相關係數的意義
r = 1,則兩變數完全正線性相關;r = 0,則兩變數沒有線性相關關係;r = -1,則兩變數完全負線性相關。
- 弱相關:r ∈ (0, 0.3)
- 中等程度相關:r ∈ (0.3, 0.6)
- 強相關: r ∈ (0.6, 1)
⑤ 回歸線
y = ax + b
- a為直線y=ax+b的斜率,也是回歸係數。
- b為直線y=ax+b的截距。
⑥ 誤差平方和與總的平方和
誤差和誤差平方和
- 誤差=實際值-預測值
- 誤差平方和(SSE)=∑(實際值-預測值)^2
- 普通最小二乘法(Ordinary Least Squares) 可以使誤差平方和(SSE)最小。
總的平方和
- 總的平方和(SST) 指y的總波動,即:SST = ∑(y的實際值-y的平均值)2
決定係數
由於誤差平方和是觀測值與預測值離差的平方和,而預測值是由回歸線所求得。因此,誤差平方和是沒有被回歸線所描述的這些觀測值的總波動。
那麼,沒有被回歸線描述的觀測點的波動比例為:誤差平方和 / 總波動?
因此,被回歸線描述的觀測點的波動比例為:R^2 = 1-R2=1?誤差平方和 / 總波動,R^2被稱作決定係數。
決定係數的意義
- 回歸線的擬合程度。即有多少百分比的y波動可以由回歸線來描述(x的波動變化)。
- R2 ∈ [0, 1],R2越接近於1則說明回歸模型越精確。
5. scikit-learn進行回歸分析
① 官方參考文檔
Generalized Linear Models
② 建立訓練數據和測試數據
第一步:導入模塊中的方法
from sklearn.cross_validation import train_test_split
- cross-validation:交叉驗證
- train_test_split:從樣本中按比例隨機選取訓練數據和測試數據
第二步:建立訓練數據和測試數據
x_train, x_test, y_train, y_test = train_test_split(樣本特徵, 樣本標籤, train_size=訓練數據佔比)
示例代碼
# 導入模塊方法from sklearn.cross_validation import train_test_split# 訓練數據和測試數據x_train, x_test, y_train, y_test = train_test_split(exam_x, exam_y, train_size=0.8)# 查看訓練數據和測試數據的比例print(原始數據特徵:, exam_x.shape)print(訓練數據特徵:, x_train.shape)print(測試數據特徵:, x_test.shape)print(
原始數據標籤:, exam_y.shape)print(訓練數據標籤:, y_train.shape)print(測試數據標籤:, y_test.shape)
③ 訓練模型
第一步:導入模塊中的線性回歸方法
from sklearn.linear_model import LinearRegression
第二步:創建模型
model = LinearRegression()
第三步:訓練模型
model.fit(x_train, y_train)
示例代碼
from sklearn.linear_model import LinearRegressionmodel = LinearRegression()model.fit(x_train, y_train)
得到如下報錯信息:
ValueError: Expected 2D array, got 1D array instead:array=[2.25 4.75 5.5 1.5 3. 5. 4.25 4. 2.75 3.5 2.5 0.75 4.5 2. 1.75 1. ].Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
大意:值錯誤:需要傳入2維數組,傳入了1維數組。
如果數據只有一個特徵,則使用array.reshape(-1, 1)
來變換數組結構;如果數據包含1個樣本,則使用array.reshape(1, -1)
來變換數據結構。
對於有n個數據的1維數組array,如果使用array.reshape(-1, 1)
則將該數組轉換為一個n行1列的數組;如果使用array.reshape(1, -1)
則將數組轉換為一個1行n列的數組。
示例:
# 導入模塊import numpy as np# 構造一維數組a = np.arange(10)print(a)print(a.shape)
輸出結果:
[0 1 2 3 4 5 6 7 8 9](10,)
進行array.reshape(-1, 1)轉換:
b = a.reshape(-1, 1)print(b)print(b.shape)
輸出結果:
[[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]](10, 1)
進行array.reshape(1, -1)轉換:
c = a.reshape(1, -1)print(c)print(c.shape)
輸出結果:
[[0 1 2 3 4 5 6 7 8 9]](1, 10)
錯誤修正
由於此處是單一特徵的問題,所以對特徵的訓練數據和測試數據進行array.reshape(-1, 1)
即可,標籤數據無需改動。
x_train = x_train.values.reshape(-1, 1)x_test = x_test.values.reshape(-1, 1)model.fit(x_train, y_train)
第四步:獲取截距和回歸係數
獲取截距(intercept): model.intercept_
獲取回歸係數(coefficient): model.coef_
第五步:獲取決定係數
model.score(x_test, y_test)
- x_test:是特徵測試值。
- y_test:是標籤測試值。
6. 協方差,相關係數和決定係數
協方差
相關係數
相關關係是一種非確定性的關係,相關係數是研究變數之間線性相關程度的量。有一個明顯的缺點,即它接近於1的程度與數據組數n相關。因為,當n較小時,相關係數的波動較大,對有些樣本相關係數的絕對值易接近於1;當n較大時,相關係數的絕對值容易偏小。特別是當n=2時,相關係數的絕對值總為1。因此在樣本容量n較小時,我們僅憑相關係數較大就判定變數x與y之間有密切的線性關係是不妥當的。
決定係數
決定係數(擬合優度)越大,自變數對因變數的解釋程度越高,自變數引起的變動佔總變動的百分比高。觀察點在回歸直線附近越密集。
二、邏輯回歸
1. 演算法
邏輯回歸非回歸演算法,而是分類演算法。邏輯回歸是一個二分分類演算法,即標籤只有兩個,可以使用0和1來表示。
2. 邏輯函數
① 公式
② 邏輯函數值的意義
y = S(z) 表示特徵z所對應的標籤發生的概率。
③ 決策面
邏輯函數值y = S(z) ≥ 0.5,則標籤值為1;邏輯函數值y = S(z) < 0.5,則標籤值為0。
3. Python實現
① 導入庫
import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 用於生成有序字典from collections import OrderedDict# 用於建立訓練數據和測試數據from sklearn.cross_validation import train_test_split# 用於邏輯回歸from sklearn.linear_model import LogisticRegression
② 提取特徵和標籤
將特徵數據和標籤數據分別賦值給不同變數。例如:x = 特徵數據, y = 標籤數據
③ 建立訓練數據和測試數據
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=比例)
- x_train:特徵數據的訓練數據。
- x_test:特徵數據的測試數據。
- y_train:標籤數據的訓練數據。
- y_test:標籤數據的測試數據。
- x:特徵數據。
- y:標籤數據。
- train_size:訓練數據所佔比例。
④ 訓練模型
model = LogisticRegression()model.fit(x_train, y_train)
注意:如果特徵數據是一維的,需要把特徵數據進行轉換:array.reshape(-1, 1)
。否則會拋出異常。
例如:
x_train = x_train.values.reshape(-1, 1)x_test = x_test.values.reshape(-1, 1)
⑤ 評估模型的準確率
model.score(x_test, y_test)
- x_test:特徵數據的測試數據。
- y_test:標籤數據的測試數據。
⑥ 根據特徵預測標籤
model.predict_proba(特徵值)
返回結果是一個數組,有兩個數據。第1個數據表示標籤為0的概率,第2個數據表示標籤為1的概率。
⑦ 使用模型根據特徵預測標籤的過程
求斜率(回歸係數)和截距
由於邏輯回歸函數為:y = S(z) = frac{1}{1+e^{-z}}y=S(z)=1+e?z1?
且:z = ax + bz=ax+b,其中,aa為斜率,即回歸係數;bb為截距。
a = model.coef_b = model.intercept_
輸入特徵x
當特徵值x已知時,z可以求得。將z的值代入邏輯回歸函數中,可以求得y=S(z)的值,即特徵值x對應標籤的概率。
判斷標籤
根據上一步求得的y=S(z)的值,如果y≥0.5,則取標籤1;如果y<0.5,則取標籤0。
4. 數據類型
① 數值數據(定量數據)
- 離散數據
- 連續數據
② 分類數據(定性數據)
無法量化的數據,但可以用數字進行表示。這些數字不具備數學意義,無法進行運算,但可以將其套入模型。
③ 時間序列數據
一段時間內定期搜集的數據序列。具有時間順序。
5. 分類與回歸的區別
① 輸出的數據類型
- 分類:離散數據(分類標籤)。
- 回歸:連續數據。
② 目的
- 分類:獲得決策面。
- 回歸:找到最優擬合回歸線。這是擬合數據的線,不是描述數據的邊界。
③ 評估指標
- 分類:正確率。
- 回歸:決定係數R^2。
5. 機器學習演算法與機器學習模型的區別
- 機器學習演算法:處理某一類型問題的通用演算法框架。邏輯回歸演算法用於處理二分分類問題。
- 機器學習模型:機器學習演算法和訓練數據得到的專門處理某一具體問題的模型。
- 機器學習模型 = 機器學習演算法 + 訓練數據
三、泰坦尼克號的生存預測
推薦閱讀: