Contents
접기
[실습] 보스톤 집값 Voting - Regression
from sklearn.linear_model import Lasso, Ridge, LinearRegression
from sklearn.ensemble import VotingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
import pandas as pd
데이터 로드 및 분할
boston.fillna(method='ffill') 을 사용하여 근처에 있는 값으로 결측치를 채워 분석하였다.
boston = pd.read_csv('./dataset/HousingData.csv')
boston.head()
boston.fillna(method='ffill', inplace= True) # 근처에 있는 값으로 채우기
x = boston.drop('MEDV',axis= 1)
y = boston['MEDV']
모델 생성 및 분할
회귀분석에서의 예시를 사용하므로 평가지표로는 Lasso, Ridge, LinearRegression 을 사용한다.
Voting은 estimator를 지정할때 튜플의 형태로 (이름, 평가지표) 지정해준다.
lasso = Lasso(alpha=0.05) # 상대적으로 알파의 값을 약하게 줘야한다
ridge = Ridge(alpha= 1)
linear = LinearRegression()
vo_r = VotingRegressor(estimators= [('LASSO',lasso),('RIDGE',ridge),('LINEAR',linear)]) # 평균
x_train, x_test, y_train,y_test = train_test_split(x, y, test_size= 0.2,
random_state= 10)
RMSE: 5.970
결정계수: 0.659
스케일링 하기 전 결과
vo_r.fit(x_train,y_train)
y_hat = vo_r.predict(x_test)
print(f'RMSE: {np.sqrt(mean_squared_error(y_test,y_hat)):.3f}')
print(f'결정계수: {r2_score(y_test,y_hat):.3f}')
# 같은 데이터여도 모형에 따라 RMSE와 결정계수 차이가 있다.
스케일링 (표준화) 진행
from sklearn.preprocessing import StandardScaler
scaled_x = StandardScaler().fit_transform(x)
x_train, x_test, y_train,y_test = train_test_split(scaled_x, y, test_size= 0.2,
random_state= 10)
vo_r.fit(x_train,y_train)
y_hat = vo_r.predict(x_test)
print(f'RMSE: {np.sqrt(mean_squared_error(y_test,y_hat)):.3f}')
print(f'결정계수: {r2_score(y_test,y_hat):.3f}')
RMSE: 5.895
결정계수: 0.668
큰 차이가 없다.
[실습] 암환자지표 Voting - Classifier
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
데이터 로드 및 분할
breast = load_breast_cancer()
# print(breast.DESCR) # 데이터셋 설명 _ class : 종속변수 (두 가지 카테고리 : 이진분류)
df = pd.DataFrame(breast.data, columns= breast.feature_names) # 독립변수 값만 데이터 프레임
data_x = breast.data
data_y = breast.target
모델 생성 및 분할
VotingClassifier 는 분류분석일 때 투표를 통해 최종 결과를 예측하므로,
투표 방식을 voting 옵션을 통해 지정해주어야 한다.
logistic = LogisticRegression(max_iter= 4000)
knn = KNeighborsClassifier()
vo_c = VotingClassifier(estimators=[('LOGISTIC',logistic),('KNN',knn)], voting='soft')
# 투표방법: Hard Voting = default
x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,
train_size= 0.8, random_state= 10, stratify= data_y)
모델 학습 및 평가
vo_c.fit(x_train,y_train)
y_hat = vo_c.predict(x_test)
print(f'정확도: {accuracy_score(y_test,y_hat):.3f}')
print(f'AUC: {roc_auc_score(y_test,vo_c.predict_proba(x_test)[:,1]):.3f}') # 하드 보팅은 안됨
# (이진분류) 결과와 비교 .. 정확도: 0.96 / AUC: 0.996
정확도: 0.921
AUC: 0.990
logisticClassifier 보다 모델의 정확도가 떨어지는 것을 알 수 있다.
[실습] 당뇨병 환자 Boosting - Regressor
from sklearn.datasets import load_diabetes
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
import pandas as pd
데이터 로드, 스케일링, 분할
from sklearn.preprocessing import MinMaxScaler
x , y = load_diabetes(return_X_y= True)
x = MinMaxScaler().fit_transform(x)
x_train, x_test, y_train,y_test = train_test_split(x, y, test_size= 0.2,
random_state= 10)
모델 생성 및 학습
GradientBoostingRegressor 방식은 가중치 값을 지정해주어야 한다.
gb_r = GradientBoostingRegressor(random_state= 10, alpha= 0.9, n_estimators= 40, max_depth= 3) # 회귀모형 40개 , max_depth : 분류기 단계
gb_r.fit(x_train, y_train)
예측 및 평가
스케일링 전
y_hat = gb_r.predict(x_test)
print(f'결정계수 : {r2_score(y_test,y_hat):.3f}')
결정계수 : 0.486
스케일링 후
y_hat = gb_r.predict(x_test)
print(f'결정계수 : {r2_score(y_test,y_hat):.3f}')
결정계수 : 0.486
결과가 동일하다. 즉 스케일링의 큰 차이가 없다. (= 숫자의 스케일이 크게 달라지지 않는다.)
[실습] 암환자 Boosting - Classifier
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
데이터 로드 및 분할
stratify = target의 class 비율을 유지 한 채로 데이터 셋을 분할한다.
분류분석에서는 성능의 차이가 많이 날수도 있으니 넣는 것이 좋다.
breast = load_breast_cancer()
df = pd.DataFrame(breast.data, columns= breast.feature_names) # 독립변수 값만 데이터 프레임
df['target'] = breast.target # 0,1 로 이루어진 데이터
data_x = breast.data
data_y = breast.target
x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,
train_size= 0.8, random_state= 10, stratify= data_y)
모델 생성 및 학습
gb_c = GradientBoostingClassifier(random_state= 10)
gb_c.fit(x_train,y_train)
모델 평가
y_hat = gb_c.predict(x_test)
print(f'정확도: {accuracy_score(y_test,y_hat):.3f}')
print(f'AUC: {roc_auc_score(y_test,gb_c.predict_proba(x_test)[:,1]):.3f}')
정확도: 0.956
AUC: 0.996
'국비 교육 > 머신러닝, 딥러닝' 카테고리의 다른 글
[머신러닝] 비지도 학습 알고리즘 - 군집분석 : K- 평균 군집 (0) | 2023.11.23 |
---|---|
[머신러닝] [문제] 비행기 연착 추측 분류 (0) | 2023.11.23 |
[머신러닝] 분류분석 : 의사 결정 트리, 앙상블 러닝 - Bagging (0) | 2023.11.22 |
[머신러닝] 분류분석 : K-NN (0) | 2023.11.22 |