갓장래, 이장래 강사님과 함께 한 7주차 머신러닝 1일차 !
10.14
머신러닝의 지도학습
그 중에서도 분류와 회귀에 대해 학습
분류 -> a or b
분류는 범줏값을 예측
회귀 -> 얼마나 많이?
연속적 숫자 예측
-예측 값에 연속성이 있는지 확인하면 분류, 회귀 쉽게 구분 가능
데이터셋 분리
학습용 / 검증용 / 평가용
수업에서는 학습용/평가용으로만 분리
[과대적합]
학습데이터에서는 성능 good!
but, 평가 데이터에서는 성능 bad
=> 학습 데이터에 대해서만 잘 맞는 모델, 실전에서 예측 성능이 좋지 않음.
[과소적합]
학습데이터보다 평가 데이터에 대한 성능good! or 모든 데이터에 대한 성능이 bad!
=>모델이 단순해 학습 데이터에 대해 적절한 훈련x
=> 과대 및 과소가 아닌 적절한 데이터의 학습이 필요.
[학습용, 평가용 데이터를 나누기 전 전처리 필요]
# 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings(action='ignore')
%config InlineBackend.figure_format = 'retina'
# 데이터 읽어오기
data = pd.read_csv('airquality.csv')
#상관관계 확인
data.corr(numeric_only=True).style.background_gradient() #numeric_only=True 수치형 데이터만 고려하겠다는 의미 #문자열or비수치형은 고려 x
데이터 분리
target = 'Ozone' x = data.drop(columns=target) y = data.loc[:,target] #'Ozone' 열을 삭제하고, 나머지 모든 열을 독립 변수(x) #단일 열, 시리즈 'Ozone' 열만 선택하여 종속 변수(y)로 설정
모듈 불러오기
from sklearn.model_selection import train_test_split
7:3으로 분리
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state = 1)#train_test_split은 랜덤하게 자르기에 강사님과 데이터프레임이 달라질 수 있음. #강사님과 같은 데이터를 사용하고자 한다면 random_state = 1을 덧붙여야함. #약속된 값을 넣은것임.
회귀문제
#1단계: 불러오기
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_absolute_error
#2단계: 선언하기
#LinearRegression함수이기 때문에 () 소괄호 꼭 쓰기model = LinearRegression()
#3단계: 학습하기
model.fit(x_train,y_train)
#4단계: 예측하기
y_pred = model.predict(x_test)
#5단계: 평가하기
mean_absolute_error(y_test,y_pred)
#예측값, 실제값
print(y_pred) print(y_test.values)
분류문제
#데이터 분리
target='ADMIT' #합격가능성 , 0과 1로 되어있음. x= data.drop(columns=target) y= data.loc[:,target]
#모듈 불러오기
from sklearn.model_selection import train_test_split
#7:3으로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, shuffle=True, stratify=y, random_state =1 )#분류 문제의 경우 stratify=1을 사용하면 데이터를 균등하게 분포하게 해주어 모델 성능을 높여줌. #shuffle=True, 섞을지 여부, 데이터의 순서가 모델 훈련에 영향을 미치지 않도록 보장 #회귀 및 분류에 모두 다 사용 가능
+추가
#학습데이터와 평가데이터의 분포가 같다고 할 수는 없음, 학습데이터와 평가데이터의 분포가 같으면 성능이 좋음.
#학습 데이터 분포 확인
y_train.value_counts(normalize=True) #값의 분포확인 함수
#평가 데이터 분포 확인
y_test.value_counts(normalize=True)
분류문제
#분류문제!
#1단계: 불러오기from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score
#2단계: 선언하기
model = KNeighborsClassifier()
#3단계: 학습하기
model.fit(x_train, y_train) #독립x와 종속y의 훈련을 통해 패턴 학습
#4단계: 예측하기
y_pred = model.predict(x_test) #독립변수에 대해 학습한 패턴을 활용하여 새로운 데이터에 대한 종속변수의 값을 예측
#5단계: 평가하기
accuracy_score(y_test,y_pred) #모델의 성능을 평가하기 위해서는 예측된 값(y_pred)과 실제 값(y_test)을 비교 #모델이 정확도를 보여주는 것.
#실제값과 예측값 비교
print(y_test.values[:10]) print(y_pred[:10])
#y_test는 실제값
#x라는 독립변수와 y라는 종속변수를 학습시켜 패턴을 찾아내고, 새로운 y종속변수 예측값(y_pred)을 도출하여 실제값(y_test)과 비교하는 것.
#우리가 제시할 수 있는 값은 예측값(y_pred)과 train의 평균값이 있음.
*회귀모델 성능은 실제값과 예측값의 차이, 오차 크기로 정함.
모델의 오차를 이야기 할 때는 하나의 값으로 표현.
_오차를 나열하는 것은 x, '오차 평균'으로 이야기 해야함.
*오차 평균을 이야기 하려면 '오차 합'을 우선적으로 구해야함.
오차의 합을 구하는 방법은
오차 제곱의 합과 오차 절대값의 합을 사용 할 수 있음.
오차 제곱의 합(SSE)의 평균 => MSE
MSE에 루트를 씌우면 => RMSE
오차 절대값의 합의 평균 => MAE
비율로 표시하는 것은 MAPE
#값은 모두 작을수록 모델 성능이 좋음.