본문 바로가기

Programming/Machine Learning

scikit-learn Regression

# linear model

 1) Least Square : 가장 간단하고 오래된 알고리즘. predict와 training set에 있는 target사이의 MSE(mean squared error)를 최소화 하는 파라미터 w, b를 찾음.



 >>> from sklearn import linear_model

>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])

  * w는 reg.coef_, b는 reg.intercept_ 속성에 저장되어있음.

  * coef_는 각 입력 feature에 하나씩 대응됨



 2) Ridge : least square와 비슷하지만 w의 절댓값을 가능한 한 작게 만들어 모든 원소가 0에 가깝게 함. 직관적으로는 모든 feature가 output에 주는 영향을 최소한으로 만듬(regularization). regularization이란 overfitting이 되지 않도록 모델을 강제로 제한한다는 의미. L2 패널티 사용(2-norm). alpha 매개변수를 통해 training set의 성능 대비 모델을 얼마나 단순화할지 지정할 수 있음. alpha값을 높이면 계수를 더 0에 가깝게 만들어 성능은 저하되지만 일반화는 잘됨



>>> from sklearn import linear_model
>>> reg = linear_model.Ridge (alpha = .5)
>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) 
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
      normalize=False, random_state=None, solver='auto', tol=0.001)
>>> reg.coef_
array([ 0.34545455,  0.34545455])
>>> reg.intercept_ 
0.13636...


 3) Lasso : Ridge와 마찬가지로 w를 0에 가깝게 함. Ridge와는 달리 L1 패널티를 사용함(1-norm). L1 regularization의 결과로 어떤 w는 실제로 0이 되는데, 이 말인 즉슨 완전히 제외되는 feature가 생긴다는 것. 어떻게 보면 feature selection이 자동으로 이뤄진다고 볼 수 있음. 일부 계수를 0으로 만들면 모델 이해가 쉬워지고 모델에서 가장 중요한 특성이 무엇인지 찾기 쉬워짐.



>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha = 0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])


 4) Least Angle

 5) Bayesian

 6) Logistic

 7) Stochastic Gradient Descent(SGD)


... 뭐 이렇게 많은거지



# k-NN(k-Nearest Neighbors)


# decision tree


Ensemble methods

 1) Forests of randomized trees

 2) Gradient tree boosting : 여러개의 decision-tree를 묶는 방법. Forests of randomized tree 와 달리 무작위성이 없고 이전 트리의 error를 보완하는 방식으로 순차적으로 트리를 만듬. 대신 사전 가지치기가 이루어짐. 일반적으로 depth를 1~5 사이로 하기 때문에 메모리를 적게 사용하고 예측이 빠름. 근본적인 아이디어는 간단한 트리를 많이 연결하는 것이고, 각각의 트리는 데이터의 일부에 대해서만 예측을 잘 수행할 수 있어 트리가 많이 추가될 수록 성능이 좋아짐.

  + loss function을 정의하고 gradient descent 방법으로 다음에 추가될 트리가 예측해야 할 값을 보정함


>>> import numpy as np
>>> from sklearn.metrics import mean_squared_error
>>> from sklearn.datasets import make_friedman1
>>> from sklearn.ensemble import GradientBoostingRegressor

>>> X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0)
>>> X_train, X_test = X[:200], X[200:]
>>> y_train, y_test = y[:200], y[200:]
>>> est = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1,
...     max_depth=1, random_state=0, loss='ls').fit(X_train, y_train)
>>> mean_squared_error(y_test, est.predict(X_test))    
5.00...


 * learning_rate : 이전 트리의 error를 얼마나 강하게 보정할지 결정하는 매개변수. 크면 트리는 보정을 강하게 하기 때문에 복잡한 모델을 만듬

 * n_estimators : ensemble에 트리가 더 ensemble 추가되어 복잡도가 커지고 training set에서의 실수를 바로잡을 기회가 많아짐