컴퓨터가 명시적으로 프로그래밍되지 않고도 데이터에서 학습하고 예측 가능
1) 지도학습
2) 비지도학습
3) 강화학습
4) 신경망 및 딥러닝
5) 자연어
6) LLM
7) 비전
- 지도학습 (명확한 답이 존재)
선형회귀, 로지스틱 회귀, 결정 트리, 랜덤 포레스트, 그래디언트 부스팅, SVM, KNN과
같은 알고리즘은
알려진 입력 데이터 세트(특징)와 데이터에 대한 알려진 응답(대상 또는 레이블)을 입력받아 모델을 훈련하여
새 데이터에 대한 응답에 대한 합리적인 예측을 생성
<알고리즘>
컴퓨터가 따라 할 수 있도록 문제를 해결하는 절차나 방법을 자세히 설명하는 과정
** 두 가지 유형의 문제에 사용
1) 회귀
대상 또는 종속 변수가 연속적이거나 정렬된 전체 값일 때 사용
2) 분류
대상 변수가 범주형일 때
1) 회귀
모델링 목적 :
입력 데이터와 연속적인 출력 데이터(실수 값) 사이의 관계 모델링
ex) 주택 가격 예측, 온도 예측, 판매량 예측
<linear> 선형회귀 모델
Linear Regression
데이터가 선형적 관계를 가진 경우
=> 간단하고 빠르며, 수치 예측 문제에 적합
Ridge
L2 정규화(규제) 적용, 계수의 크기 감소
Lasso
L1 정규화(규제) 적용, 변수 선택 기능
ElasticNet
L1 및 L2 정규화(규제) 적용, 두 가지 정규화의 균형 조절
<tree>
Decision Tree Regresssior(의사결정 나무 회귀)
데이터가 비선형 관계를 가진 경우
=> 직관적인 결정 규칙 생성, 범주형 및 수치형 데이터 모두에 적용 가능
<ensemble>
Random Forest Regressior(랜덤 포레스트 회귀)
다양한 특성을 가진 데이터 셋이나 고차원 데이터에 유용
=> 여러 결정 트리의 평균 예측을 통해 안정적인 예측 성능을 제공
+ GBM, XGBoost, LightGBM(분류, 회귀 모두 사용 가능)
MSE(평균 제곱 오차)
mean_squared_error(y_test,y_pred)
오차의 제곱의 평균
추정값과 실제값 차이의 평균제곱 측정
RMSE(제곱 평균 오차)
np.sqrt(mean_squared_error)
MSE의 제곱근
MAE(평균 절대 오차)
mean_absolute_error(y_test,y_pred)
방향을 고려치 않고 추정값과 실제값 사이의 평균 거리 == 절대 오차의 평균
R-squared ...
r2_score(y_test,y_pred)
1 - (잔차 제곱합 / 총 제곱합 )
조정된 R제곱
1 - (1-r2) * (n-1) / (n-p-1)
n = 데이터포인트의 수
X_test.shape[0]
p = 독립변수의 수
X_test.shape[1]
** 교차검증
cross_val_score
주어진 모델을 데이터를 여러 번 나누어 학습하고 평가하여 모델의 일반화 성능을 측정
cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
scoring: 성능을 평가할 지표
(default : accuracy)
cv : 교차검증 폴드 수
-> 이 검증의 rmse를 구할려면
np.sqrt(-cvs로 구한 값).mean()
=> 점수가 높을 수록 더 좋은 사이킷런의 프레임워크에 맞추기 위해 -1을 곱함
[이 함수는 최종적으로 학습된 모델을 반환하지 않기 때문에, 전체 훈련 데이터셋에 대해 별도로 모델을 학습시켜야 함]
2) 분류
입력 데이터를 미리 정의된 여러 클래스 또는 범주 중 하나로 할당하는 문제 해결
ex) 스팸 메일 분류, 질병 진단, 이미지 분류
이산적인 클래스 또는 범주
ex) 양성/음성, 고양이/개/새
<Linear>
Logistic Regression(로지스틱 회귀)
이진 분류 문제에 주로 사용
=> 간단하고 해석이 용이하며, 클래스 확률 추정 가능
모든 실수 입력에 대해 0과 1사이의 값을 반환, S자 형태를 띠는 함수
* max_iter : 데이터가 수렴하지 않을 때 반복 횟수를 늘려서 해결 가능
* solver : 메모리 사용 최소화
<Tree>
Decision Tree Classifier(결정 트리)
범주형 또는 수치형 데이터를 분류하는데 유용
=> 직관적인 결정 규칙 생성 및 비선형 관계도 학습 가능
최대한 많은 데이터가 속할 수 있도록 균일한 데이터 세트를 구성하도록 분할하는 것이 필요
<균일도 측정법>
엔트로피(주어진 데이터 집합의 혼잡도) 이용
criterion ='entropy','gini'
1. 정보 이득 지수
1 - 엔트로피(혼잡도) 지수
정보 이득이 높은 속성기준으로 분할
2. 지니계수
불평등 지수를 나타내는 계수
0 평등, 1 불평등
* max_depth : 트리의 최대 깊이
* min_samples_split : 노드에 있어야 하는 최소 샘플 수
* min_samples_leaf : 분할 후 리프 노드에 있어야 하는 최소 샘플 수
* max_features : 노드 분할을 위해 고려되는 최대 기능 수
* max_leaf_nodes : 트리의 최대 리프 노드 수
-> 위에서 3번째까지는 가지치기작업에 사용됨
=> 과적합 방지, 일반화 성능 향상
Random Forest Classifier(랜덤 포레스트)
고차원 데이터나 다양한 특성을 가진 데이터에 적합
=> 여러 결정 트리를 앙상블하여 과적합을 줄이고 더욱 정확한 예측 가능
SVM(서포트 벡터 머신)
복잡한 데이터 분류에 유용, 데이터의 차원이 높은 경우에도 사용가능
=> 최대 마진을 활용해 클래스를 분리하는 경계 찾음
* kernel : 1. linear 2. poly 3. RBF
1. 간단하고 빠르며, 데이터가 선형적으로 구분될 때
2. 비선형적으로 분포된 데이터를 더 잘 처리 할 수 있음
3. 비선형적인 경계를 가진 데이터에서 가장 효과적
* C매개변수 : 각 데이터 포인트들을 얼마나 정확하게 분류할 것인지 결정
KNN(K-최근접 이웃)
데이터가 밀집된 지역에 있는 경웅 유용, 단순한 분류문제도 적용 가능
=> 이웃한 데이터 포인트의 클래스를 기반으로 예측 수행
KNeighborsClassifier(n_neighbors=k) - default 5
k값에 따라 예측의 정확도가 달라지므로 적당한 k값을 찾아야함
-> 짝수일 경우 동점 발생할 수 있으니 되도록 홀수, 짝수일 땐 거리순으로
< 정확도(accuracy) >
: 전체예측에서 예측이 얼마나 잘 맞았는가
=> 가장 직관적인 분류 성능 평가 지표
(TP+TN) / (TP+TN+FN+TN)
< 정밀도(precision) >
: 양성이라고 예측한 것중에 얼마나 잘 맞았는가
TP / (TP+FP)
< 재현율(recall) >
: 양성인 데이터를 얼마나 잘 예측을 했는가
TP / (TP+FN)
*** 정밀도 / 재현율 trade-off관계
임곗값이 낮아질수록 (양성 예측값이 많아질수록)
FN은 하락(분모가 작아진다) => 재현율은 올라감
FP 증가(분모가 커진다) => 정밀도 내려감
< f1-score >
: 모델이 양성 데이터를 얼마나 잘 예측하는지에 대한 전반적인 측정치
정밀도와 재현율의 조화 평균
2 * (precision * recall) / (precision + recall)
< roc-auc >
ROC 곡선 : 모델이 양성 클래스를 어떻게 잘 예측하는지에 대한 성능 그래프
FPR이 변할 때 TPR이 어떻게 변하는지 나타내는 곡선
=> 재현율과 1-특이성의 관계를 보여줌
[특이성]
실제로 음성인 사례들 중에서 모델이 음성으로 예측한 비율
TNR = TN / (TN+FP)
FPR = FP/(TN+FP) = 1- 특이성 = (TN+FP) /(TN+FP) - TN/(TN+FP)
=> 음성인 사례 중 예측을 잘못한 비율
TPR 재현율
AUC값은 ROC 곡선 아래의 면적, 값이 클수록 모델의 성능이 좋다(0~1)
** 교차검증
GridSearchCV : 하이퍼파라미터 튜닝 기법
모델의 성능을 최적화하기 위해 다양한 하이퍼파라미터 조합을 시도하는 방법
=> 모든 조합을 시도하여 가장 좋은 성능을 내는 조합 찾음
-> bestparams : 최적의 하이퍼파라미터 조합 출력
-> bestscore : 최적 조합에서의 교차 검증 평균 점수 출력
파라미터 그리드 설정
param_grid = {
어느 모델을 쓰냐에 따라 다름
}
모델 초기화
ex) svc = SVC()
그리드 서치 초기화
gird_search = GridSearchCV(svc, param_grid,cv=5)
=> cv = 5 : 교차 검증에서 데이터를 나누는 한 단위 또는 조각(폴드)을 의미
-> ex) 데이터가 100개이고 cv =5이면
첫번째 (샘플 1~20) 테스트 세트로 사용 나머지 폴드(샘플 21~100)를 훈련 세트로 사용
두번째 폴드 (샘플 21~40) 테스트 세트, 나머지(샘플 1-20 및 41-100)를 훈련 세트로 사용
이 과정 반복하여 각 폴드가 한번씩 테스트 세트로 사용되도록
** 혼동행렬을 활용하여 성능 비교
행 : 실제 클래스
열 : 예측된 클래스
[20, 0, 0] 0행 0열 정확한 예측
[0, 45, 1] 1행 1열 정확한 예측 / 1행 2열 잘못된 예측
[0, 2, 30] 2행 2열 정확한 예측 / 2행 1열 잘못된 예측
** 앙상블 학습
=> 서로 다른 또는 같은 알고리즘 결합
보팅
: 서로 다른 알고리즘을 가진 분류기 결합
1) 하드 보팅 : 다수결
2) 소프트 : 결정 확률을 모두 더해 평균하고 이들 중 가장 높은 레이블 값을 최종 보팅 결과값으로 선정
배깅
: 각각의 분류기가 모두 같은 유형의 결합
-> 원본 훈련 데이터 세트에서 복원 추출 방식을 사용하여 여러 개의 서브셋을 생성
=> 분산 감소, 오버피팅 방지, 병렬 처리 가능
ex) random forest
부스팅
ex) GBM
여러 약한 학습기를 합하여 강한 학습기를 만드는 방식
-> 학습기를 순차적으로 학습시키며 이전 학습기의 잔여 오차에 집중하여 학습
높은 예측 성능을 가지고 있지만 훈련 시간이 오래 걸리고, 하이퍼파라미터 튜닝이 중요한 단점 존재
이를 기반으로 한 고급 알고리즘 개발
XGBoost, XGBClassifier
n_estimator
learning_rate
verbose : 경고와 정보 메시지를 숨기는 설정
XGB와 차이
레벨별 성장 : (XGB) 트리의 각 레벨이 다음 레벨로 이동하기 전에 완전히 구축
-> 다음 수준의 모든 잎이 고려되기 전에 주어진 수준의 모든 잎이 분할됨을 의미
=> 트리를 성장시키는 균형 잡힌 방법
리프형 성장 : 손실 함수에 따라 최상의 분할을 기반으로 분할 선택
-> 가장 좋은 잎을 선택하여 나무를 계속 성장 시킴
=> 트리 불균형
** 나이브 베이즈 분류
베이즈의 정리를 적용한 간단한 확률적 분류 알고리즘
텍스트 분류에서 많이 사용
P(A∣B)=P(B)P(B∣A)⋅P(A)
ex) 스팸 분류
사전 확률
스팸 이메일의 사전 확률 : 40 / 100 = 0.4
아닌 이메일 확률 : 60 / 100 = 0.6
특성별 확률 계산(우도) : 무료라는 단어가 포함 될 때
스팸 이메일 중 20개가 무료라는 단어 포함 시
p(무료/스팸) : 20 / 40 = 0.5
스팸이 아닌 이메일 중 5개가 무료 라는 단어 포함
p(무료/스팸아님) : 5 / 60 = 0.083
새 이메일에 무료라는 단어 포함시
p(무료) : (0.5×0.4)+(0.083×0.6)=0.2+0.0498=0.2498
-> 무료가 들어간 이메일을 받았을 때 실제 스팸인 경우와 아닌 경우
p(스팸/무료) = p(무료/스팸) x p(스팸) / p(무료)
: 0.5×0.4/0.2498=0.8006
p(스팸아님/무료) : p(무료/스팸아님) x p(스팸아님) / p(무료)
: 0.083×0.6/0.2498=0.1994
가장 높은 확률 선택
p(스팸/무료) : 0.8006
p(스팸아님/무료) : 0.1994
=> 스팸으로 분류