回歸能做什么呢?《機器學習實戰》的作者認為:
回歸能做任何事情。
回歸模型大致分為2個階段,訓練階段和預測階段, 訓練階段需要對歷史確定結果的數據進行反饋訓練,使得模型的參數適應當前的輸入與預期輸出, 預測階段在完善模型的基礎上對新的數據進行模擬輸出。這兩個階段對于一個模型都至關重要。
回歸模型廣泛地應用于機器學習,深度學習,AI,人工智能等領域,在這里我們講對它的應用進行深入淺出的學習與探討。
針對不同的數據(數值型和標稱型),我們一般有兩種預測傾向,數值預測,類別預測,這兩種預測有某種潛在的關系,可以說,分類是高層次及符合條件下的數量預測,它建立在數量預測的基礎上(這個后面的章節會cover到)
這篇文章的研究環境,基于jupiter notebook
, 依賴的python包有pydataset
, scilearn
, pandas
, seaborn
以及必要的線性代數
,統計學
及高等數學
的知識, 簡書中無法解析mathjax
,所以公式均以截圖的形勢給出.
線性回歸模型
這是最簡單的回歸模型,也是最general的機器學習算法,也包含了機器學習與回歸模型最樸素和使用的思考方法, 它基于一個樸素的假設:輸入和輸出之間存在簡單的線性關系.
其中y 是輸出的數值,xi 是輸入的數值,x0 =1, n是輸入的特征數量
線性回歸算法需要確定θ(j)使得平方誤差的和最小, 構造損失函數:
這里簡單地給出選用誤差函數為平方和的概率證明
首先我們提出了一個符合常理的假設:誤差是服從均值為0,的高斯分布 的
即
最大似然估計
最小二乘法
對θ求導得到:
梯度下降法
其中
對于n=1時,y=mx+b, python梯度下降代碼如下:
def stepGradient(b_current, m_current, points, learningRate):
b_gradient = 0
m_gradient = 0
N = float(len(points))
for i in range(0, len(points)):
b_gradient += -(2/N) * (points[i].y - ((m_current*points[i].x) + b_current))
m_gradient += -(2/N) * points[i].x * (points[i].y - ((m_current * points[i].x) + b_current))
new_b = b_current - (learningRate * b_gradient)
new_m = m_current - (learningRate * m_gradient)
return [new_b, new_m]
重復執行stepGradient
后得到J(θ)與執行次數的關系:
下面是sklearn的線性模型的應用:
from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn import linear_model
import matplotlib.pyplot as plt
lr = linear_model.LinearRegression()
boston = datasets.load_boston()
y = boston.target
# cross_val_predict returns an array of the same size as `y` where each entry
# is a prediction obtained by cross validated:
predicted = cross_val_predict(lr, boston.data, y, cv=10)
fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show()
回歸的正則化與特征選擇
為了避免過擬合的問題,使模型更general一些,正則化的理念被提了出來,正則化被用來減小單個θ(j)的影響,基本原理是在全局損失函數中加入懲罰函數
Elastic net方法
這便轉化為了普通的套索問題