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
- 현재 위치에서 거리가 가장 가까운 3개를 추출했을 때
- 거리에 따라서 가중치를 부여하는 방식
- (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
- 1 - (예측한 개수 / 전체 개수 - (예측한 개수 / 전체 개수) ...
- 엔트로피
- 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)
- 별로 좋아지지는 않는다.
'Python' 카테고리의 다른 글
[Python] 지도학습 연습 _ 범주형 데이터 이진분류 (0) | 2024.03.07 |
---|---|
[Python] 머신러닝_앙상블 (0) | 2024.03.07 |
[Python] 분류 (0) | 2024.03.07 |
[Python] 머신러닝 (0) | 2024.03.07 |
[Python] 지도학습 연습 _ 자전거 대여 수요 예측 (0) | 2024.03.06 |