본문 바로가기
Study/Machine learning,NLP

머신러닝(5) - Regression(2)

by 왕방개 2024. 3. 5.

2.비선형 회귀

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은 게으른 알고리즘: 데이터를 예측하기 위해서 모든 데이터가 메모리에 상주해야하는 알고리즘

=>이해하기 쉬운 White-Box 알고리즘 이고 별도의 훈련을 거치지 않은 쉬운 알고리즘이라서 데이터 전처리(결측치 대체나 새로운 피쳐 추가 - 지역적 정보를 이용하기 때문에 다중 공선성 문제는 고려할 필요가 없음)에 많이 이용합니다. 

 

=>API는 sklearn.neigbors.KNeighborsRegressor 

from sklearn.neighbors import KNeighborsRegressor

#가중 평균 적용
regressor = KNeighborsRegressor(n_neighbors=3,weights='distance')

regressor.fit(X_data,X_target)

print(X_data.head())

#print(X_data.loc[0].values.shape(13,1))
print(regressor.predict(X_data.loc[0].values.reshape(1,13)))
print(X_target.loc[0])

 

3)Decision Tree

=>개요

-트리 기반으로 리프에 도달하면 리프 데이터의 평균을 가지고 예측

-불순도 지표

 지니 계수(오분류 오차): 1 - (예측한 개수/전체 개수)^2-(예측한 개수/전체 개수)^2 ... 

 한쪽으로만 분류가 되면 0: 가장 좋은 형태

 가장 나쁜값이 0.5

 

  엔트로피(무질서도)

 

=>API : DecisionTreeRegressor

 

=>RandomForest 나 GBM, XGBoost , LightGBM의 기반이 되는 모델

 

=>다양한 파라미터가 존재하기 때문에 하이퍼 파라미터 튜닝이 필수

=>스케일링 과정은 필요 없음 ->시각화 graphiz 작

#API 사용
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)

 

 

4)SVM(Support Vector Machine)


=>   분류에서는 가장 가까운 데이터와의 거리가 가장 먼 결정 경계를 만들어가는 방식
=>   회귀에서는 제한된 마진 오류안에서 가능한 많은 샘플이 들어가도록 학습
마진 오류의 폭은 epsilon 파라미터로 설정
=>  API는 sklearn.svm.LinearSVR 이 선형 SVM 회귀이고 비선형은 SVR클래스인데 이 경우는 epsilon외에도 kernel, degree(kernel이 poly일 때 추가할 다항식의 차수), C(규제)와 같은 하이퍼 파라미터를 추가로 사용합니다.
=>  선형 SVM 적용

#데이터 생성
np.random.seed(42)
m = 50
X = 2 * np.random.rand(m, 1)
y = (4 + 3 * X + np.random.randn(m, 1))

X_train = X[:40]
y_train = y[:40]

X_test = X[40:]
y_test = y[40:]

#선형 SVM 생성 및 훈련
from sklearn.svm import LinearSVR
#epsilon 은 결정 경계의 폭 - 이 안에 데이터를 배치
#이 값이 작을 수록 훈련 데이터에 정확해지고 클수록 훈련 데이터와 잘 안맞습니다.

epsilons = [0.1 ,0.5,1.0,1.5,2.0]
for epsilon in epsilons:
    
    svm_reg = LinearSVR(epsilon = epsilon, random_state = 42)
    svm_reg.fit(X_train, y_train)
    y_pred = svm_reg.predict(X_test)
    mse = mean_squared_error(y_test,y_pred)
    rmse=np.sqrt(mse)
    print(epsilon,":",rmse)

 

 

 

'Study > Machine learning,NLP' 카테고리의 다른 글

머신러닝(7)-실습1  (1) 2024.03.06
머신러닝(6)-Ensemble  (0) 2024.03.05
머신러닝(4)-Regression(1)  (0) 2024.03.04
머신러닝(3)-Classification(2)  (0) 2024.02.29
머신러닝(2)-Classification(1)  (0) 2024.02.28