[에이쁠] 머신러닝 1일차

3e_b1n2·2024년 10월 14일
5
post-thumbnail

갓장래, 이장래 강사님과 함께 한 7주차 머신러닝 1일차 !

머신러닝의 이해

학습 방법에 따른 분류

  • 지도학습 : 모델이 정답이 주어진 상태에서 학습하여 새로운 데이터 결과를 정확히 예측하도록 만든 학습 방식
  • 비지도학습 : 정답이 없는 데이터에서 패턴, 구조, 군집을 찾아내 데이터 특성을 분석하거나 유사 그룹을 형성하는 학습방식
  • 강화 학습 : 주체가 환경과 상호작용하며 행동에 따른 보상을 받아 최적의 행동을 선택하고 이를 통해 목표를 달성하는 정책을 학습하는 방식

과제에 따른 분류

  • 분류문제 : 주어진 데이터 기반으로 사전에 정의된 이산적 클래스 중 하나로 분류 (지도학습)
  • 회귀문제 : 입력 데이터를 이용해 연속적 수치값을 예측, 예측 결과가 특정 범위 내 실수로 나타나는 문제 (지도학습)
  • 클러스터링 : 데이터에 라벨X, 유사 특성을 가진 데이터끼리 그룹화해 패턴을 발견하는 비지도 학습 문제

10.14
머신러닝의 지도학습
그 중에서도 분류와 회귀에 대해 학습

  • 분류 -> a or b
    분류는 범줏값을 예측

  • 회귀 -> 얼마나 많이?
    연속적 숫자 예측

-예측 값에 연속성이 있는지 확인하면 분류, 회귀 쉽게 구분 가능

데이터셋 분리
학습용 / 검증용 / 평가용

수업에서는 학습용/평가용으로만 분리

과대적합 vs 과소적합

[과대적합]
학습데이터에서는 성능 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


#값은 모두 작을수록 모델 성능이 좋음. 
profile
에이블기자 최멍빈입니다.

0개의 댓글