簡單線性回歸、邏輯回歸和泰坦尼克號的生存預測

一、機器學習入門:簡單線性回歸

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?

scikit-learn.org

② 建立訓練數據和測試數據

第一步:導入模塊中的方法

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. 機器學習演算法與機器學習模型的區別

  • 機器學習演算法:處理某一類型問題的通用演算法框架。邏輯回歸演算法用於處理二分分類問題。
  • 機器學習模型:機器學習演算法和訓練數據得到的專門處理某一具體問題的模型。
  • 機器學習模型 = 機器學習演算法 + 訓練數據

三、泰坦尼克號的生存預測

推薦閱讀:

廣告CTR預估中預測點擊率的校準
初探機器學習之邏輯回歸

TAG:線性回歸 | 邏輯回歸 | 數據分析 |