機器學習_ML_scikit-learn:RANSACRegressor
- 使用隨機個數樣本做群內值來適合出模型
- 把剩餘的樣本拿來測試,若數據落在定義的容許範圍內,那就加入群內值
- 使用新的群內值來適合模型
- 使用群內值來預估模型誤差
- 若誤差小於定義的容許值,或迭代次數已到定義數,即終止演算法!
- 預設scikit-learn使用MAD來估計選擇群內值,MAD代表目標變量y的絕對中位偏差。
IMPORT
from sklearn.linear_model import RANSACRegressor
CLASS
RANSACRegressor(base_estimator=None, is_data_valid=None, is_model_valid=None,
loss='absolute_loss', max_skips=inf, max_trials=100,
min_samples=None, random_state=None, residual_metric=None,
residual_threshold=None, stop_n_inliers=inf, stop_probability=0.99,
stop_score=inf)
參數說明
base_estimator
if None:sklearn.linear_model.LinearRegression()
限制分類器需有fit與score兩個method!
is_data_valid
在適合模型之前會使用隨機選擇的數據呼叫此函式is_data_valid(X, y),
如果return False就pass掉此次的選擇的子樣本,並記入n_skips_invalid_data_
is_model_valid
loss
max_skips
定義由is_data_valid與is_model_valid產生的最大跳過次數
max_trials
最大迭代次數
min_samples
從原始數據集中取出的最小隨機樣本數,分類器為LinearRegression下,預設為X.shape[1] + 1
random_state
亂數的隨機種子
residual_metric
計算樣本與迴歸線間的垂直距離絕對值
lambda dy: np.sum(np.abs(dy), axis=1)
residual_threshold
樣本與迴歸線間的絕對值定義值(如上定義,小於才計入群內值)
配合residual_metric執行
stop_n_inliers
找到多少群內值之後停止迭代
stop_probability
stop_score
方法
fit(X, y)
適合、訓練模型
fit(X, y, sample_weight=None)
score(X, y)
模型得分
如同直接用分類器的score,也因為該分類器一定要有score的method。
score(X, y)
or
estimator_.score(X, y)
predict(X)
使用適合出的模型進行預測。
predict(X)
get_params()
get_params(deep=True)
set_params()
set_params(**params)
屬性
inlier_mask_
群內值(true, false)
如要取群外值可利用numpy做not
np.logical_not(inlier_mask)
estimator_
回傳所用的base_estimator物件
可直接使用該物件相關屬性,如下範例
estimator_.coef_ # 斜率
estimator_.intercept_ # 截距
n_trials_
執行的迭代次數,一定<=max_trials的設置
n_skips_no_inliers_
無群內值而跳過的迭代次數
n_skips_invalid_data_
由is_data_valid定義的無效數據跳過的迭代次數
n_skips_invalid_model_
由於is_model_valid定義的無效模型而跳過的迭代次數
範例
用波士頓房地產來做範例
import pandas as pd
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+')
df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS',
'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
# 驗證一下資料有沒有進來
df.head()
x = df[['RM']].values
y = df['MEDV'].values
rom sklearn.model_selection import train_test_split
x_train,xX_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
ransac = RANSACRegressor(LinearRegression(), # 使用的線性分類器
max_trials=200, # 迭代次數
min_samples=200, # 隨機個數
residual_metric=lambda x:np.sum(np.abs(x),axis=1),
residual_threshold=0.001, # 樣本與迴歸線間的距離絕對值
random_state=0)
ransac.fit(x_train, y_train)
ransac.estimator_.coef_
ransac.estimator_.intercept_
如果要用多參數去做驗證的話,測試用GridSearchCV似乎有問題,可能在下功力不足!
所以改用迴圈來測試
param_trials = [200, 300] # 設置迭代次數
param_samples = [200, 300] # 設置隨機樣本數
param_threshold =[0.001, 0.002, 0.003] # 設置群內值
params = []
for i in param_trials:
for j in param_samples:
for k in param_threshold:
ransac = RANSACRegressor(LinearRegression(), # 使用的線性分類器
max_trials=i, # 迭代次數
min_samples=j, # 隨機個數
residual_metric=lambda x:np.sum(np.abs(x),axis=1),
residual_threshold=k, # 樣本與迴歸線間的距離絕對值
random_state=0)
ransac.fit(x_train, y_train)
a = ransac.score(x_train, y_train)
b = ransac.score(x_test, y_test)
c = ransac.estimator_.coef_[0]
d = ransac.estimator_.intercept_
params.append({'trials':i,
'samples':j,
'threshold':k,
'trainR2':a,
'testR2':b,
'coef':c,
'intercept':d})
import json
jp = json.dumps(params) # 轉json
df = pd.read_json(jp) # 讀入pandas
在這次在公司的資料測試中發現到,線性迴歸有其極限,一定的條件之後幾乎最佳r2已不再異動。
或許不同的資料集會有不同的結果。
沒有留言:
張貼留言