1. 알고리즘
1)회귀 알고리즘
1. LInear Regression
위 사진처럼 y = ax+b의 형태로 알고리즘을 찾는 방법이며, 회귀에서만 쓸수 있다.
model.coef_ 기울기(a)
model.intercept_ 절편(b)
from sklearn.linear_model import LinearRegression 라이브러리
2. K-Nearest Neighbor
주변이웃에게 물어보는 알고리즘이다.
- 주변 값들에게 물어보는 알고리즘
- 회귀, 분류 둘다 쓸 수 있다.
- scaling이 필요하다.
from sklearn.neighbors import KNeighborsRegressor # target이 회귀일때
from sklearn.neighbors import KNeighborsClassifier # target이 분류일때
#scaling
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_s = scaler.transform(x_train)
x_test_s = scaler.transform(x_test)
# 알고리즘
model = KNeighborsRegressor()
model.fit(x_train_s, y_train)
y_pred = model.predict(x_test_s)
# 파라미터
n_neighbors = 5
3. Decision Tree
- 스무고개를 이용한알고리즘
- 회귀, 분류 둘다 쓸수 있음
- 그냥 써도 되지만 가독성을 위해 graphviz설치 후 pip install graphviz
from sklearn.tree import DecisionTreeClassifier # target이 분류
from sklearn.tree import DecisionTreeRegressor #t target이 회귀
plt.figure(figsize=(8,5))
plot_tree(model,
filled = True, # tree색채움 안채우면 흑뱍
feature_names = x.columns, # feature 이름지정
class_names = y.unique(), # class 이름지정
)
plt.show()
from sklearn.tree import export_graphviz
from IPython.display import Image
# 이미지 파일 만들기
export_graphviz(model, # 모델 이름
out_file='tree.dot', # 파일 이름
feature_names=x.columns, # Feature 이름
class_names=['No', 'Yes'], # Target Class 이름
rounded=True, # 둥근 테두리
precision=2, # 불순도 소숫점 자리수
filled=True) # 박스 내부 채우기
# 파일 변환
!dot tree.dot -Tpng -otree.png -Gdpi=300
# 이미지 파일 표시
Image(filename='tree.png')
# 변수 중요도 시각화
plt.figure(figsize=(5, 5))
plt.barh(list(x), model.feature_importances_)
plt.show()
# 하이퍼 파라미터 설정
max_depth # 기존에는 지니불순도가 0이 될때까지 계층을 만들어가지만 max_depth이하로 내려가지않는다. default=none
min_samples_split # 최소한의 sample개수
min_samples_leaf # 말단 노드가 되기 위한 최소한의 sample 개수
max_feature # x의 columns의 개수를 몇개로 할건지
max_leaf_nodes # 말단 노드의 최대 개수
4. Logistic Regression
- 분류모델에서만 쓸 수 있음
- 시그모이드 함수로 판별함
from sklearn.linear_model import LogisticRegression
# 파라미터
max_iter = 100 값이 수렴을 하기 위해 반복을 하는데 그에 대한 최대횟수를 지정한다.
#method
model.predict_proba(x_test)[:10] # 확률값 보기
5. Support Vector Machine = SVM
- scatter표에서 선긋기!
- 회귀떄는 SVR 분류는 SVC
from sklearn.svm import SVC # 분류
from sklearn.svm import SVR # 회귀
# 파라미터
kernel='rbf' # Decision Boundary 형태 결정 'linear' 도 있음
C = # 높을 수록 margin의 길이가 짧아지면서 값을 잘 잡아내지만 margin이 짧아 실제 운영서 분류가 안될수도 있음
gamma = 데이터들의 경계가 복잡해지는 정도
6. K-Fold Cross Validation
- 학습데이터만으로 테스트데이터로 분할하여 테스트하는 방법
from sklearn.model_selection import cross_val_score
score = cross_val_score(model,x_train, y_train, cv=10, scoring='r2_score) cv=학습데이터를 10분할 default=5
print(score)
print(score.mean())
- cv = cross validation
7. 최선의 파라미터 찾는법
1) grid search
- 파라미터를 전부 돌려보고 값이 제일 좋은것을 추출
from sklearn.model_selection import GridSearchCV
param = {'max_depth': range(1, 51)}
model_dt = DecisionTreeRegressor(random_state=2022)
# Grid Search 선언
# cv=5
# scoring='r2'
model = GridSearchCV(model_dt, # 기본 모델 이름
param, # 앞에서 선언한 튜닝용 파라미터 변수
cv=5, # k-Fold Cross Validation (default=5)
scoring='r2') # 평가 방법(default='r2')
model.fit(x_train, y_train)
# 중요 정보 확인
print('최적파라미터:', model.best_params_)
print('최고성능:', model.best_score_)
2) random search
- 범위내에 파라미터를 랜덤으로 추출하여 값이 좋은것을 추출
from sklearn.model_selection import RandomizedSearchCV
param = {'max_depth': range(1, 51)}
# Random Search 선언
model = RandomizedSearchCV(model_dt, # 기본 모델 이름
param, # 앞에서 선언한 튜닝용 파라미터 변수
cv=5, # k-Fold Cross Validation (default=5)
n_iter=20, # Random하게 시도할 횟수 (default=10)
scoring='r2') # 평가 방법
model.fit(x_train, y_train)
print('최적파라미터:', model.best_params_)
print('최고성능:', model.best_score_)
7. 앙상블
데이터의 알고리즘을 찾을때 한가지의 알고리즘이 아닌 여러 개의 모델을 결합하여 강력한 모델을 생성하는 기법
1. 보팅
1) 하드보팅
1 :3번, 2 : 1번 이면 1을 선택
2) 소프트 보팅
1번일확률 0.65, 2번일 확률 0.35 이라면 1번 을 선택
# 5가지 알고리즘 선언
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from lightgbm import LGBMRegressor
# voting 선언
from sklearn.ensemble import VotingRegressor
# scaling 선언
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import make_pipeline
# 평가 선언
from sklearn.metrics import *
# 선언하기
estimators = [('lr', LinearRegression()),
('dt', DecisionTreeRegressor()),
('knn', make_pipeline(MinMaxScaler(), KNeighborsRegressor())),
('rdf', RandomForestRegressor()),
('lgb', LGBMRegressor())]
model = VotingRegressor(estimators=estimators)
# 학습하기
model.fit(x_train, y_train)
2. 배깅(Bootstrap AGGregaTING = BAGGING)
보팅은 여러개의 알고리즘을 사용한다면 배깅은 학습데이터를 나눈후 하나의 알고리즘을 사용하여 나온 결과를 투표한다.
배깅 = 랜덤포레스트
여러개의 tree가 모여서 forest가 됨
from sklearn.ensemble import RandomForestRegressor
3. 부스팅(Boosting) XGBoost, LightGBM
배깅은 병렬로 처리했다면 부스팅을 순차적으로 처리하여 가중치를 조절하여 다음모델에 영향을 주는기법
1.) XGBOOST
gradient boosting가 속도가 느려 탄생한 모델
from xgboost import XGBClassifier
from xgboost import XGBRegressor
# 선언하기
model = XGBClassifier(max_depth=5, random_state=1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
2) LIGHTGBM
XGBOOST도 속도가 느려 탄생한 모델
from lightgbm import LGBMClassifier
from lightgbm import LGBMRegressor
# 선언하기
model = LGBMClassifier()
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
4. 스태킹
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import StackingClassifier
from lightgbm import LGBMClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import make_pipeline
from sklearn.metrics import *
# 선언하기
estimators = [('dt', DecisionTreeClassifier()),
('knn', make_pipeline(MinMaxScaler(), KNeighborsClassifier())),
('lr', LogisticRegression(max_iter=1000)),
('lgb', LGBMClassifier())]
model = StackingClassifier(estimators=estimators,
final_estimator= RandomForestClassifier())
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred = model.predict(x_test)
# 평가하기
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
# 성능정보 수집
result['Stacking'] = accuracy_score(y_test, y_pred)
마지막을 랜덤포레스트로!
VIF(Variance Inflation Factors)
독립변수x 는 종속변수 y와 관계가 있어야하며, 같은 x와 관계가 있으면 부정확한 결과를 도출할 수 있다.
vif = pd.DataFrame()
# VIF 확인 및 기록
vif['feature'] = x.columns
vif['vif_factor'] = [variance_inflation_factor(x.values, i) for i in range(x.shape[1])]
# VIF 기준으로 정렬렬
vif.sort_values(by='vif_factor', ascending=False, inplace=True)
vif.reset_index(drop=True, inplace=True)
# 확인인
vif
여기서 vif가 10 이상이면 잘못된 결과를 도출할 수 있으니 하나를 제거하고 회귀를 해야함
2. 평가 방법
1) 회귀모델(수치형변수)
회귀모델의 결과값과 실제값이 똑같게 하기는 어려움 따라서 두 값의 오차를 줄일수록 좋은 모델이라 할 수 있음.
1. 오차 합
2 -1 +2 -3 = 0
오차가 0이 라면 예측값과 실제값이 똑같다는건데 이부분에 대해 오류가 발생하기 때문에 쓰지 않는다.
2. 오차들의 제곱
- 오차 제곱합(SSE : Sum Squared Error) - 4 + 1 + 4 + 9 =18
- 오차 제곱합 평균(MSE : Mean sum Squared Error) - SSE/n
- 오차제곱합의 제곱근(RMSEㅇ : Root Mean Squared Error) - sqrt(SSE)
3. 오차들의 절댓값
- 절대값합의 평균(MAE : Mean Absolute Error) - 오차들의 절댓값들의 합/n
- 오차절대값의 합의 평균(MAPE : Mean Absolute Percentage Error) - (∑|(실제값-예측값)/실제값|) / n
4. R2_score
- r**2 = SSR/SST = 1-SSE/SST
- 전체 오차들중에 우리가 만들모델이 설명을 얼마나 잘했냐를 알려줌
회귀모델의 성능을 평가할때는 크게 5가지 평가방법이있는데 error를 나타내는 평가방법은 낮을수록 score은 높을수록 좋은 모델이라는 뜻이다.
- mean_absolute_error
- mean_squared_error
- root_mean_squared_error
- mean_absolute_percentage_error
- r2_score
2) 분류모델(범주형변수)
- 혼동행렬(Confusion Matrix)
Predicted Value(예측값) | |||
Actual Value(실제값) | 0 | 1 | |
0 | TN(True Negative) | FP(False Positive) | |
1 | FN(False Negative) | TP(True Posivite) |
- 정확도(Accuracy) : 전체중에서 예측한것에서 맞춘값(TN+TP) / (TN + FP + FN + TP)
- 정밀도(Precision) : 1의 정밀도는 TP/(FP + TP) 0의정밀도는 TN/(TN+FN)
- 재현율,민감도(Recall) : 1의 재현율 TP/(FN+TP)
- 특이도(Specificity) : 0의 재현율 TN/(TN+FP)
- F1-score : 2*Precision *Recall/(Precision + Recall)
정밀도와 재현율은 각각 단점들이 존재한다.
예를들어 코로나 검사 키트를 사용하여 양성인지 음성인지 판단한다고 해보자
우리가 코로나 의심증상이 있어서 자가키트로 검사를 할때 양성이 뜬다면 신속항원검사를 통해 한번더 검사하지만, 음성이 뜬다면 하지않는다. 즉 양성에는 오차가 존재해도되지만 음성에는 오차가 존재해서는 안된다.
ex) Precision이 낮다면? 비가안오는 날인데 비가 온다고해서 우산을 챙기는 수고 발생
ex) Recall이 낮다면? 비가오는 날인데 비가 안온다고 해서 비에 맞음
ex) Specificity가 낮다면? 비가 안오는 날인데 비가 온다고해서 우산을챙기는 수고 발생
만약 옷가게 손님100명중 1명만 옷을 사고 99명은 보기만한다고 가정해보자
이떄 알고리즘에 따라 예측을 했는데 100명모두 보기만한다고 예측했다.
이때 accuracy는 99%의 정확도를 가지는 모델로 보여질 것이고 정확도 대비 좋은 모델이 아니다.
하지만 이는 데이터들이 불균형하기때문에 나타난 현상이고, 이를 해결할 수 있는 평가 방법은 F1-score이다.
F1_score(기하평균)은 precision(산술평균)과 Recall(조화평균)중 더 작은 값에 영향을 많이 받게하여 데이터의 불균형을 해결하는 평가방법이다.
1. classification_report
accuracy, recall등 전부 구하기
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
confusion_matrics 시각화
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_predictions(y_test, y_pred, cmap=plt.cm.Blues)
plt.show()
'머신러닝' 카테고리의 다른 글
[machine learning] 모델 평가 (0) | 2023.03.10 |
---|