2017年8月23日 星期三

機器學習-ML-scikit-learn_RANSACRegressor

機器學習_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已不再異動。
或許不同的資料集會有不同的結果。

沒有留言:

張貼留言