一、目錄

文章分為以下幾個內容:

  • 機器學習介紹
  • 機器學習步驟
  • 線性回歸
  • 邏輯回歸

二、機器學習介紹

機器學習就是給定一定的輸入,通過施加一定的演算法,得到輸出,然後通過學到的知識,輸入新的數據,獲得新的輸出。

以網易雲音樂為例,當我們在網易雲聽自己喜歡的每一首音樂的時候,就會形成樣本數據,這些樣本數據在機器學習裏叫訓練數據,然後再把這些樣本製作成二維表格,在上面標記每首歌的數據屬性(節奏,強度,聽歌的時長),這些屬性在機器學習中叫特徵,再把每首歌分成喜歡和不喜歡,這個類別在機器學習中叫標籤。接著,再把訓練數據提供給機器演算法,然後它就會學習出一個關於每首歌的特徵和個人是不是喜歡(標籤)的一個模型,當我們在聽歌的時候,它會根據歌曲的特徵,輸出我們是喜歡還是不喜歡。當這個模型讀入越來越多的訓練數據的時候,它就會變得越來越準確,且當遇到錯誤的時候會自動修正。上面這過程就叫機器學習。

三、機器學習步驟

  • 提出問題
  • 理解數據
  • 數據清洗
  • 構建模型
  • 評估

四、線性回歸

  1. 線性回歸含義

線性回歸分析用於研究一個變數與另一個變數或多個變數之間的關係。

以雙變數為例,變數X和變數Y之間可以有三種關係:正線性相關、負線性相關、不是線性相關(隨機)。

2. 衡量變數間的相關性

衡量變數間的相關性需要一個統計量,既能夠描述兩個變數的相關性方向(正相關、負相關),也能夠表示變數的相關性程度。

衡量變數間的相關性一般會涉及兩個統計量,一個是協方差,一個是相關係數。

(1) 協方差

cov(x,y)=E[(X-E(X))(Y-E(Y))]

以兩個點的協方差計算為例:

frac{(x1-ux)(y1-uy)+(x2-ux)(y2-uy)}{2}

註:Ux是X的均值, Uy是Y的均值

(2) 相關係數

r=frac{X和Y的協方差}{X的標準差 	imes Y的標準差}

=frac{cov(X,Y)}{sigma xsigma y}

其中-1<=r<=1

  • 當r=1時,完全正相關
  • 當r=-1時,完全負相關
  • 當r=0時,表示不是線性相關, 但可能是其他相關, 只能說他不是線性相關
  • 一般來講,0至0.3或-0.3至0表示相關性較弱,0.3至0.6或-0.6至-0.3表示中等程度相關,0.6至1或-1至-0.6表示變數強相關。

(3) 協方差和相關係數間的區別

相關係數是標準化後的協方差,消除了變數變化幅度的影響,表示變數每單位變化的相似程度。

(4) 相關係數-Python實現 :

#相關係數:corr返回結果是一個數據框,存放的是相關係數矩陣
rDf=examDf.corr()
print(相關係數矩陣:)
rDf

3. 線性回歸

(1) 簡單線性回歸利用python實現

簡單線性回歸

from collections import OrderedDict
import pandas as pd

  • 第一步,建立數據集

#數據集
examDict={
學習時間:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,
2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
分數: [10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)

  • 第二步:提取標籤和特徵

#提取特徵和標籤
#特徵features
exam_X=examDf.loc[:,學習時間]
#標籤labes
exam_y=examDf.loc[:,分數]
#繪製散點圖
import matplotlib.pyplot as plt

#散點圖
plt.scatter(exam_X, exam_y, color="b", label="exam data")

#添加圖標標籤
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()

  • 第三步:建立訓練數據和測試數據


train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和測試數據(test)
第一個參數:所要劃分的樣本特徵
第2個參數:所要劃分的樣本標籤
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 = .8)
#輸出數據大小
print(原始數據特徵:,exam_X.shape ,
,訓練數據特徵:, X_train.shape ,
,測試數據特徵:,X_test.shape )

print(原始數據標籤:,exam_y.shape ,
訓練數據標籤:, y_train.shape ,
測試數據標籤: ,y_test.shape)
原始數據特徵: (20,) ,訓練數據特徵: (16,) ,測試數據特徵: (4,)
原始數據標籤: (20,) 訓練數據標籤: (16,) 測試數據標籤: (4,)
#繪製散點圖
import matplotlib.pyplot as plt

#散點圖
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")

#添加圖標標籤
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Pass")
#顯示圖像
plt.show()

  • 第四步:構建訓練模型


sklearn要求輸入的特徵必須是二維數組的類型,但是因為我們目前只有1個特徵,所以需要用reshape轉行成二維數組的類型。
錯誤提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature

#將訓練數據特徵轉換成二維數組XX行*1列
X_train=X_train.values.reshape(-1,1)
#將測試數據特徵轉換成二維數組行數*1列
X_test=X_test.values.reshape(-1,1)

#第1步:導入線性回歸
from sklearn.linear_model import LinearRegression
# 第2步:創建模型:線性回歸
model = LinearRegression()
#第3步:訓練模型
model.fit(X_train , y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

  • 第五步:最優擬合線


最佳擬合線:z=??+??x
截距intercept:a
回歸係數:b

#截距
a=model.intercept_
#回歸係數
b=model.coef_

print(最佳擬合線:截距a=,a,,回歸係數b=,b)
最佳擬合線:截距a= 11.1707480711 ,回歸係數b= [ 15.48742033]
#繪圖
import matplotlib.pyplot as plt
#訓練數據散點圖
plt.scatter(X_train, y_train, color=blue, label="train data")

#訓練數據的預測值
y_train_pred = model.predict(X_train)
#繪製最佳擬合線
plt.plot(X_train, y_train_pred, color=black, linewidth_=3, label="best line")

#添加圖標標籤
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()

(2) 評估模型精確度

  • 最佳擬合線

能最好地接近所有數據點的線被稱最佳擬合線,要求出最佳擬合線,可以首先假設直線公式為y=a+bx。最佳擬合線即表達式為y=a+bx且使得y的實際觀察值與每個x相對應的y的估計值的差距為最小的線。

  • 決定係數R平方

一個點的誤差=實際值-預測值

y誤差平方和= Sigma(y實際值-y預測值)^2 【y預測值:用直線估計出的值】

y的總波動= Sigma(y實際值-y平均值)^2

有多少百分比的y波動沒有被回歸線描述=誤差平方和/總波動

決定係數R平方=有多少百分比的y波動被回歸線描述

=1-誤差平方和/總波動

故由上可得出決定係數R:

1、可表示回歸線擬合程度,有多少百分比的y波動可以有回歸線來描述(X的波動變化)

2、R越大,回歸模型越精確

  • 決定係數R平方利用python實現

#線性回歸的scroe方法得到的是決定係數R平方
#評估模型:決定係數R平方
model.score(X_test , y_test)
0.83901474742039228
#繪圖
import matplotlib.pyplot as plt
#訓練數據散點圖
plt.scatter(X_train, y_train, color=blue, label="train data")

#訓練數據的預測值
y_train_pred = model.predict(X_train)
#繪製最佳擬合線:標籤用的是訓練數據的預測值y_train_pred
plt.plot(X_train, y_train_pred, color=black, linewidth_=3, label="best line")

#測試數據散點圖
plt.scatter(X_test, y_test, color=red, label="test data")

#添加圖標標籤
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#顯示圖像
plt.show()

4. 邏輯回歸

邏輯回歸是應用非常廣泛的一個分類機器學習演算法,它將數據擬合到一個logistic函數中,從而能夠完成對事件發生的概率進行預測。從大的類別上來說,邏輯回歸是一種有監督的統計學習方法,主要用於對樣本進行分類。

在線性回歸模型中,輸出一般是連續的,例如

y=f(x)=ax+b

對於每一個輸入的x,都有一個對應的y輸出。x和y都是連續型數據。但是對於邏輯回歸,輸入可以是連續的,但輸出一般是離散的,即只有有限多個輸出值。例如,其值域可以只有兩個值{0, 1},這兩個值可以表示對樣本的某種分類,高/低、患病/健康、陰性/陽性等,這就是最常見的二分類邏輯回歸。

邏輯回歸與線性回歸的關係

邏輯回歸與線性回歸模型的形式基本上相同,都具有 ax+b,其中a和b是待求參數,其區別在於他們的因變數不同,線性回歸直接將ax+b作為因變數,即y = ax+b,而logistic回歸則通過函數S將ax+b對應到一個隱狀態p,p= S(ax+b),然後根據p與1-p的大小決定因變數的值。這裡的函數S就是Sigmoid函數。

邏輯函數: y=S(z)=frac{1}{1+e^{-z}}

邏輯函數值y表示:當分類結果的標籤等於1時,x對應的概率值

其中:z=a+bx——線性回歸

機器學習模型所做得事情就是將訓練數據的特徵,和標籤轉化成一個決策面。邏輯回歸,函數得到概率值以後,如何映射到標籤0或標籤1上,就是決策面要做的事情。如果邏輯函數獲得概率數值y>=0.5,那麼標籤=1,如果邏輯函數獲得概率值y<0.5,那麼標籤=0.

邏輯回歸Python實現

建立數據集

from collections import OrderedDict
import pandas as pd
import numpy as np
#數據集
examDict={
學習時間:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,
2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
通過考試:[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
examDf.head()

提取特徵和標籤

#特徵features
exam_X=examDf.loc[:,學習時間]
#標籤labes
exam_y=examDf.loc[:,通過考試]

繪製散點圖

import matplotlib.pyplot as plt

#散點圖
plt.scatter(exam_X, exam_y, color="b", label="exam data")

#添加圖標標籤
plt.xlabel("Hours")
plt.ylabel("Pass")
#顯示圖像
plt.show()

.建立訓練數據集和測試數據集


train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和測試數據(test)
第一個參數:所要劃分的樣本特徵
第2個參數:所要劃分的樣本標籤
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 = .8)
#輸出數據大小
print(原始數據特徵:,exam_X.shape ,
,訓練數據特徵:, X_train.shape ,
,測試數據特徵:,X_test.shape )

print(原始數據標籤:,exam_y.shape ,
訓練數據標籤:, y_train.shape ,
測試數據標籤: ,y_test.shape)
原始數據特徵: (20,) ,訓練數據特徵: (16,) ,測試數據特徵: (4,)
原始數據標籤: (20,) 訓練數據標籤: (16,) 測試數據標籤: (4,)

#繪製散點圖
import matplotlib.pyplot as plt

#散點圖
plt.scatter(X_train, y_train, color="blue", label="train data")
plt.scatter(X_test, y_test, color="red", label="test data")

#添加圖標標籤
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Pass")
#顯示圖像
plt.show()

訓練模型(使用訓練數據)


理解了reshape後,我們再來看下邏輯回歸模型
sklearn要求輸入的特徵必須是二維數組的類型,但是因為我們目前只有1個特徵,所以需要用安裝錯誤提示用reshape轉行成二維數組的類型。
錯誤提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature

#將訓練數據特徵轉換成二維數組XX行*1列
X_train=X_train.values.reshape(-1,1)
#將測試數據特徵轉換成二維數組行數*1列
X_test=X_test.values.reshape(-1,1)

#導入邏輯回歸包
from sklearn.linear_model import LogisticRegression
# 創建模型:邏輯回歸
model = LogisticRegression()
#訓練模型
model.fit(X_train , y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class=ovr, n_jobs=1,
penalty=l2, random_state=None, solver=liblinear, tol=0.0001,
verbose=0, warm_start=False)

模型評估(使用測試數據)

#評估模型:準確率
model.score(X_test , y_test)
0.75

進一步理解什麼是邏輯函數

#獲取概率值
#第1個值是標籤為0的概率值,第2個值是標籤為1的概率值
model.predict_proba(3)
array([[ 0.3294175, 0.6705825]])
#預測數據:使用模型的predict方法可以進行預測。這裡我們輸入學生的特徵學習時間3小時,模型返回結果標籤是1,就代表預測該學生未通過考試。
pred=model.predict([[3]])
print(pred)
[1]

理解邏輯回歸函數
斜率slope
截距intercept

#第1步:得到回歸方程的z值
#回歸方程:z=??+??x
#截距
a=model.intercept_
#回歸係數
b=model.coef_

x=3
z=a+b*x

#第2步:將z值帶入邏輯回歸函數中,得到概率值
y_pred=1/(1+np.exp(-z))
print(預測的概率值:,y_pred)
預測的概率值: [[ 0.6705825]]

推薦閱讀:

相關文章