什么叫回歸浅萧,什么叫分類?
對連續(xù)型變量做預測叫回歸捐凭,對離散型變量做預測叫分類
線性回歸的主要任務是什么淑廊?
線性回歸的任務是找到一個從特征空間X到輸出空間Y的最優(yōu)的線性映射函數
什么是線性回歸
簡單地說就是,給定由d個屬性描述的示例線性回歸試圖學得一個通過屬性的線性組合來進行預測的函數旧烧,即
簡單的線性回歸
在這里我們只討論一種最簡單的情形:輸入的屬性數目只有一個影钉。對于離散屬性,若屬性間存在“序”關系掘剪,可通過連續(xù)化將其轉化為連續(xù)值平委,例如二值屬性“身高”的取值“高”“矮”可轉化為{1.0,0.0}杖小,三值屬性“高度”的取值“高”“中”“低”肆汹,可轉化為{1.0,0.5予权,0.0}昂勉;若屬性間不存在序關系,假定有k個屬性值扫腺,則通常轉化為k維向量岗照,例如屬性“瓜類”的取值“西瓜”,“南瓜”笆环,“黃瓜”可轉化為(0,0,1),(0,1,0),(1,0,0).
線性回歸試圖學得
這里我們可以使用均方誤差確定w和b攒至。均方誤差是回歸任務中最常用的性能度量,因此我們試圖讓均方誤差最小化躁劣,即
基于均方誤差最小化來進行模型求解的方法稱為“最小二乘法”迫吐,在線性回歸中,最小二乘法就是試圖找到一條直線账忘,使所有樣本到直線上的歐式距離之和最小志膀。
求解w和b使上面公式最小化的過程熙宇,稱為線性回歸模型的最小二乘“參數估計”,分別對w和b求導可得
令上面兩條公式為零可得到w和b最優(yōu)解的閉式解
這里舉一個例子:這個例子是預測住房價格的溉浙,我們要使用一個數據集烫止。在這里,我要根據不同房屋尺寸所售出的價格戳稽,畫出我的數據集馆蠕。比方說,如果你朋友的房子是1250平方尺大小惊奇,你要告訴他們這房子能賣多少錢互躬。那么,你可以做的一件事就是構建一個模型颂郎,也許是條直線吨铸,從這個數據模型上來看,也許你可以告訴你的朋友祖秒,他能以大約220000(美元)左右的價格賣掉這個房子诞吱。
多元線性回歸
更多的情形,樣本是由多個屬性描述的竭缝,此時房维,我們試圖學得類似的可利用最小二乘法來對w和b進行估計。
簡單的線性回歸實現
這是一個簡單的線性回歸抬纸,也就是只有一個變量的線性回歸咙俩。
import numpy as np
def fitSLR(x, y):
'''
訓練簡單線性模型
'''
n = len(x) # 獲取數據集長度
dinominator = 0 # 分母
numerator = 0 # 分子
for i in range(0, n):
numerator += (x[i] - np.mean(x))*y[i]
dinominator += (x[i] - np.mean(x))**2
b1 = numerator/float(dinominator) # 回歸線斜率
b0 = np.mean(y)-b1*np.mean(x) # 回歸線截距
return b0, b1
def predict(x, b0, b1):
'''
根據學習算法做預測
'''
return b0 + x*b1
x = [1, 3, 2, 1, 3]
y = [14, 24, 18, 17, 27]
b0, b1 = fitSLR(x, y)
print("intercept:", b0, " slope:", b1)
x_test = 6
y_test = predict(6, b0, b1)
print("y_test:", y_test)
#輸出
#intercept: 10.0 slope: 5.0
#y_test: 40.0
我們也可以畫圖看看
# 畫圖
import matplotlib.pyplot as plt
y_perd = b0 + b1*np.array(x)
plt.scatter(x, y) #散點圖
plt.plot(x, y_perd, color='black')
plt.xlabel("x")
plt.ylabel("y")
plt.axis([0, 6, 0, 30]) # 設置橫縱坐標的范圍
plt.show()
使用UCI大學公開的數據,跑線性回歸
數據的介紹:http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant
數據的下載地址:http://archive.ics.uci.edu/ml/machine-learning-databases/00294/
下載的是一個壓縮包湿故,我們把他解壓后阿趁,是一個xlsx,我們可以先用excel把他打開坛猪,然后另存為.csv格式脖阵,方便我們讀取。
里面是一個循環(huán)發(fā)電場的數據墅茉,共有9568個樣本數據命黔,每個數據有5列,分別是:AT(溫度), V(壓力), AP(濕度), RH(壓強), PE(輸出電力)就斤。我們的問題是得到一個線性的關系悍募,對應PE是樣本輸出,而AT/V/AP/RH這4個是樣本特征洋机, 機器學習的目的就是得到一個線性回歸模型坠宴,即:
PE=θ0+θ1?AT+θ2?V+θ3?AP+θ4?RH
而需要學習的,就是θ0,θ1,θ2,θ3,θ4θ0,θ1,θ2,θ3,θ4這5個參數绷旗。
用pandas來讀取數據
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', None) # 輸出結果顯示全部列
# 讀取數據喜鼓,從第1行開始
data = pd.read_csv(r"ccpp.csv", header=0)
驗證一下看是否讀取成功,輸出數據的前5行
# 顯示數據的前五行忧设,如果是最后五行,用data.tail()颠通,默認為5行
print(data.head())
# 查看描述性統(tǒng)計,只能看數值型數據.
#print(data.describe())
準備運行算法的數據
# 顯示數據的維度
print(data.shape)
# 現在我們開始準備樣本特征X,我們用AT膀懈, V顿锰,AP和RH這4個列作為樣本特征
x = data[['AT', 'V', 'AP', 'RH']]
# 接著我們準備樣本輸出y, 我們用PE作為樣本輸出
y = data[['PE']]
劃分訓練集和數據集
# 劃分訓練集和測試集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# 查看訓練集和測試集的維度
# print('x_train.shape:', x_train.shape)
# print('x__test.shape:', x_test.shape)
# print('y_train.shape:', y_train.shape)
# print('y_test.shape:', y_test.shape)
運行scikit-learn的線性模型
# 從sklearn庫中導入線性回歸函數
from sklearn.linear_model import LinearRegression
# 執(zhí)行函數獲得一個線性回歸模型
LR = LinearRegression() # 這是一個未經訓練的機器學習模型
# 對模型傳入輸入數據x_train和輸出數據y_train
LR.fit(x_train, y_train) # 這是一個經過訓練的機器學習模型
# 輸出線性回歸的截距和各個系數
print('LR.intercept_:', LR.intercept_)
print('LR.coef_:', LR.coef_)
輸出如下:
LR.intercept_: [452.84103716]
LR.coef_: [[-1.97313099 -0.23649993 0.06387891 -0.15807019]]
也就是說PE與其他的4個變量的關系如下:
PE=452.84103716?1.97313099?AT?0.23649993?V+0.06387891?AP?0.15807019?RH
評價模型
MSE (Mean Squared Error)叫做均方誤差
RMSE(Root Mean Squard Error)均方根誤差启搂。
# 評價模型硼控。這里使用MSE和RMSE來評價模型的好壞
y_pred = LR.predict(x_test)
# 引入sklearn模型評價工具庫
from sklearn import metrics
print("MSE: ", metrics.mean_squared_error(y_test, y_pred))
print("RMSE: ", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
輸出如下:
MSE: 19.73369930349765
RMSE: 4.442262858442491
畫圖觀察結果
這里畫圖顯示真實值和預測值的變化關系,離中間的直線y=x直接越近的點代表預測損失越低胳赌。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# 畫散點圖
ax.scatter(y_test, y_pred)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
# 設置標題
ax.set_title('Plot')
# 設置X軸標簽
ax.set_xlabel('Measured')
# 設置Y軸標簽
ax.set_ylabel('Predicted')
# 顯示所畫的圖
plt.show()
完整的代碼可以去我的碼云查看牢撼。