更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
雖然普通線性迴歸預測結果整體而言仍是挺不錯的,可是從數據上能夠看出數據集中有較多的離羣值,所以本節將使用RANSAC算法針對離羣值作處理,即根據數據子集(所謂的內點)擬合迴歸模型。算法
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算法下降了離羣值潛在的影響,可是這並不能說明這種方法對將來新數據的預測性能是否有良性影響。數據結構