1) 개요

- 회귀 계수의 결합이 비선형인 경우다. 
- 회귀 함수를 기반으로 하지 않는다.
 
 

2) KNN (K-Nearest Neighbors) 회귀

- 새로운 데이터가 들어왔을 때 가장 가까운 이웃 몇 개를 찾아서 그 이웃의 데이터로

  • 분류는 투표를 해서 다수결로 타겟 결정
  • 회귀는 평균을 이용해서 타겟 결정

- 가중 회귀

  • 일반적인 경우
    • 현재 위치에서 거리가 가장 가까운 3개를 추출했을 때
      A는 거리가 3.2인데 5
      B는 거리가 11.5인데 6.8
      C는 거리가 1.1인데 값은 9.0
    • (5 + 6.8 + 9.0) / 3 = 약 6.9
  • 거리에 따라서 가중치를 부여하는 방식
    • (5/3.2 + 6.8/11.5 + 9.0/1.1) / (1/3.2 + 1/11.5 + 1/1.1)  
  • KNN을 생성할 때 weights 매개변수에 distance를 설정하면 거리에 따른 가중치 적용

- KNN은 게으른 알고리즘

  • 데이터를 예측하기 위해서 모든 데이터가 메모리에 상주해야 하는 알고리즘

- 이해하기 쉬운 화이트 박스 알고리즘이고 별도의 훈련을 거치지 않는 간단한 알고리즘이라서 데이터 전처리(결측치 대체나 새로운 피처 추가)에 많이 이용 

  • 결측치나 새로운 피처 추가: 지역적 정보를 이용하기 때문에 다중공선성 문제는 고려할 필요가 없음. 전체 데이터를 사용하는게 아니라서 실제 예측하는 데는 사용하지 않음.
  • 화이트 박스 알고리즘: 내가 보고 이해하기 쉬운 알고리즘, 대표적으로 KNN과 트리 / 블랙박스 알고리즘: 딥러닝

- API는 sklearn.neighbors.KNeighborsRegressor

.
 

 
 
- KNN을 사용할 때는 스케일링 반드시 수행
 
 
 
 
 

3) Decision Tree

- 트리 기반
- 불순도 지표

  • 지니계수 (오분류 오차)
    • 1 - (예측한 개수 / 전체 개수 - (예측한 개수 / 전체 개수) ...
      한쪽으로만 분류가 되면 0: 가장 좋은 형태
      가장 나쁜 값이 0.5
  • 엔트로피

- API: DecisionTreeRegressor
- RandomForest나 GBM, XGBoost, LightGBM의 기반이 되는 모델
- 다양한 파라미터가 존재하기 때문에 하이퍼 파라미터 튜닝 필수
- 스케일링 과정은 필요 없음

m = 200
X = np.random.rand(m, 1)
y = 4 * (X - 0.5) ** 2 + np.random.randn(m, 1)/10

from sklearn.tree import DecisionTreeRegressor

tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)
tree_reg.fit(X, y)
#시각화
from graphviz import Source
from sklearn.tree import export_graphviz

#decision_tree_dot 이라는 파일로 저장
export_graphviz(tree_reg, out_file='decision_tree.dot', 
               feature_names=['X'], class_names=['y'], 
               rounded=True, filled=True)

#파일을 출력
with open('decision_tree.dot') as f:
    dot_graph = f.read()
    
src = Source(dot_graph)
src

 

tree_reg = DecisionTreeRegressor(max_depth=12, random_state=42)
tree_reg.fit(X_data, y_target)

#피처의 중요도
print(tree_reg.feature_importances_)
[0.07125588 0.00142092 0.00421452 0.00076625 0.0256092  0.57625877
 0.01265629 0.07238728 0.00095654 0.01204435 0.02101767 0.00643705
 0.1949753 ]

 
 
 

4) SVM  (Support Vector Machine)

- 분류에서는 가장 가까운 데이터와의 거리가 가장 먼 결정 경계를 만들어가는 방식
- 회귀에서는 제한된 마진 오류 안에서 가능한 많은 샘플이 들어가도록 학습

  • 마진 오류의 폭은 epsilion 파라미터로 설정
#시드 고정 후 가우시안 분포를 따르는 데이터셋을 만듭니다.
np.random.seed(42)
m = 50
X = 2 * np.random.rand(m,1)
y = (4 + 3 * X + np.random.randn(m,1)).ravel()

X_train = X[:40]
X_test = X[40:]

y_train = y[:40]
y_test = y[40:]

 
 
 

# 모델 생성 과 훈련
from sklearn.svm import LinearSVR

epsilons = [0.1, 0.5, 1.0, 1.5, 2.0]
for epsilon in epsilons: 
    svm_reg = LinearSVR(epsilon=1.5, random_state=42)
    svm_reg.fit(X_train,y_train)

# svm_reg = 마진이 큰 모형(epsilon=1.5)

    y_pred = svm_reg.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    rmse = np.sqrt(mse)
    print(epsilon, ":", rmse)
  • 별로 좋아지지는 않는다.