更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你: https://www.cnblogs.com/nickchen121/p/11686958.html
RANSAC算法線性回歸(波斯頓房價預測)
雖然普通線性回歸預測結果總體而言還是挺不錯的,但是從數據上可以看出數據集中有較多的離群值,因此本節將使用RANSAC算法針對離群值做處理,即根據數據子集(所謂的內點)擬合回歸模型。
一、RANSAC算法流程
- 隨機選擇一定數量的樣本作為內點擬合模型
- 用模型測試其他所有的點,把落在給定范圍內的點放入內點集
- 調整模型中使用的所有內點
- 用內點重新擬合模型
- 評估模型預測結果與內點集相比較的誤差
- 如果性能達到自定義的閾值或指定的迭代次數,則終止,否則返回步驟1
二、導入模塊
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')
三、獲取數據
df = pd.read_csv('housing-data.txt', sep='\s+', header=0)
X = df[['RM']].values
y = df['MEDV'].values
四、訓練模型
# 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])
五、可視化
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]))
RANSAC算法線性回歸斜率:9.546893365978166
使用RANSAC算法之后可以發現線性回歸擬合的線與未用RANSAC算法擬合出來的線的斜率(普通線性回歸斜率:9.10210898118031)不同,可以說RANSAC算法降低了離群值潛在的影響,但是這並不能說明這種方法對未來新數據的預測性能是否有良性影響。