02-11 RANSAC算法線性迴歸(波斯頓房價預測)

更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython

RANSAC算法線性迴歸(波斯頓房價預測)

雖然普通線性迴歸預測結果整體而言仍是挺不錯的,可是從數據上能夠看出數據集中有較多的離羣值,所以本節將使用RANSAC算法針對離羣值作處理,即根據數據子集(所謂的內點)擬合迴歸模型。算法

1、RANSAC算法流程

  1. 隨機選擇必定數量的樣本做爲內點擬合模型
  2. 用模型測試其餘全部的點,把落在給定範圍內的點放入內點集
  3. 調整模型中使用的全部內點
  4. 用內點從新擬合模型
  5. 評估模型預測結果與內點集相比較的偏差
  6. 若是性能達到自定義的閾值或指定的迭代次數,則終止,不然返回步驟1

2、導入模塊

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from sklearn.linear_model import RANSACRegressor
from sklearn.linear_model import LinearRegression
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')

3、獲取數據

df = pd.read_csv('housing-data.txt', sep='\s+', header=0)
X = df[['RM']].values
y = df['MEDV'].values

4、訓練模型

# max_trials=88即最大迭代次數爲88次
# min_samples=66即樣本最低數量爲66個
# loss=‘absolute_loss’即便用均方偏差損失函數
# residual_threshold=6即只容許與擬合線垂直距離在6個單位之內的採樣點被包括在內點集
ransac = RANSACRegressor(LinearRegression(),
                         max_trials=88,
                         min_samples=66,
                         loss='absolute_loss',
                         residual_threshold=6)
ransac.fit(X, y)

# 獲取內點集
inlier_mask = ransac.inlier_mask_
# 獲取非內點集
outlier_mask = np.logical_not(inlier_mask)
# 創建迴歸線
line_X = np.arange(3, 10, 1)
# 因爲ransac模型指望數據存儲在二維陣列中,所以使用line_X[:, np.newaxis]方法給X增長一個新維度
line_y_ransac = ransac.predict(line_X[:, np.newaxis])

5、可視化

plt.scatter(X[inlier_mask], y[inlier_mask], c='r',
            edgecolor='white', marker='s', label='內點')
plt.scatter(X[outlier_mask], y[outlier_mask], c='g',
            edgecolor='white', marker='o', label='離羣點')
plt.plot(line_X, line_y_ransac, color='k')

plt.xlabel('平均房間數目[MEDV]', fontproperties=font)
plt.ylabel('以1000美圓爲計價單位的房價[RM]', fontproperties=font)
plt.title('波士頓房價預測', fontproperties=font, fontsize=20)
plt.legend(prop=font)
plt.show()
print('RANSAC算法線性迴歸斜率:{}'.format(ransac.estimator_.coef_[0]))

png

RANSAC算法線性迴歸斜率:9.546893365978166

使用RANSAC算法以後能夠發現線性迴歸擬合的線與未用RANSAC算法擬合出來的線的斜率(普通線性迴歸斜率:9.10210898118031)不一樣,能夠說RANSAC算法下降了離羣值潛在的影響,可是這並不能說明這種方法對將來新數據的預測性能是否有良性影響。數據結構

相關文章
相關標籤/搜索