- 머신러닝
- 머신러닝 학습
- 라이브러리
- Kaggle
- 데이터 전처리
- 실습
- 지도학습
- 회고
📚 머신러닝의 정의
- 컴퓨터가 명시적으로 프로그래밍 되지 않아도 데이터를 통해 학습하고, 예측할 수 있도록 하는 기능
- 대량의 데이터를 알고리즘에 입력하여 학습과정을 통해 모델을 생성하고 예측을 수행
☑️ 머신러닝의 구성요소
데이터셋
- 머신러닝은 데이터셋을 통해서 학습하며, 일반적으로 데이터셋은 입력/출력 데이터(레이블)로 구성됩니다.
- 머신러닝의 베이스가 데이터 셋이기 때문에 중요!
- 입력 데이터(Feature): 정답을 추론하기 위한 정보 데이터
- 출력 데이터(레이블): 정답을 맞추기 위한 데이터
특징(Feature)
- 데이터셋에서 모델이 학습할 수 있는 개별 속성
- 주택가격예측을 예시로 들 경우 주택의 크기, 위치, 방의 개수 등이 Feature에 해당합니다
레이블(label)
- 예측하고자 하는 목표 변수(맞추기 위한 변수 = 정답이 목표 변수다)
- 지도학습 모델에서는 레이블이 있는 데이터셋을 이용하여 모델을 학습 시킵니다
모델
- 데이터의 특징으로 부터 정답(레이블)을 예측할 수 있는 지식을 학습할 수 있는 프로그램/함수
- 입력데이터와 출력 데이터간의 관계를 학습하여 새로운 데이터에 대한 예측 수행
- 데이터가 있을 때 특징과 규칙을 찾는 알고리즘
학습
- 모델이 데이터를 통해서 패턴을 인식하고, 이를 기반으로 예측을 수행 할 수 있도록 함수 내의 가중치를 조정하는 과정
📚 머신러닝의 학습
데이터 수집
- 모델을 학습시키기 위한 필요 데이터 수집
데이터 전처리
- 결측값 처리, 이상치 제거, 정규화 등등
Feature 선택
- 중요 feature(특징)을 선택하고 불필요한 Feature를 제거하여 학습효율 높임
- 여러가지 특징을 결합해서 수학적, 알고리즘적 작업을 진행해 성능을 높여주는 중요한 단계
모델 선택
- 문제에 적합한 머신러닝 알고리즘을 선택
- 여러 특징들의 조합으로 시도해보고 성능을 늘리는 단계
모델 훈련
- 트레이닝 데이터셋을 사용해서 모델을 학습시킴
- 훈련을 하며 모든 단계에서 추가, 제거 등 많은 시도가 필수적 (무엇을 보고 추가 제거를 하는거지?)
모델 평가
- 테스트 데이터셋을 사용하여 모델 성능을 평가
모델 배포
- 학습된 모델을 실제 환경에 배포하여 예측 수행
☑️ 학습 방법
지도 학습 (Supervised Learning)
레이블이 있는 데이터셋을 이용하여 모델을 학습시키는 방법
- 회귀(Regression) : 연속적인 값을 예측하는 문제 ex : 주택 가격 예측, 주식 가격예측
- 분류(Classification) : 이산적인 값을 예측하는 문제 ex : 이메일 스팸 필터링, 이미지 분류
비지도 학습 (Unsupervised Learning)
레이블이 없는 데이터셋을 이용하려 모델을 학습시키는 방법
- 군집화(Clustering) : 데이터를 유사한 그룹으로 묶는 문제 ex : 고객 세분화, 이미지 세그멘테이션
- 차원축소 (Dimensionality Reduction) : 고차원 데이터를 저차원으로 변환 ex : PCA, t-SNE
앙상블 학습 (Ensemble Learning)
여러개의 머신러닝 모델을 결합하여 더 나은 성능을 얻는 방법
- 배깅(Bagging) : 여러 모델을 독립적으로 학습시키고, 예측을 평균내거나 다수결 투표로 최종 예측 ex : 랜덤포레스트
- 부스팅(Boosting) : 여러 모델을 순차적으로 학습시키고, 이전 모델의 오차를 보완하여 최종 예측을 수행 ex : 그래디언트 부스팅, XGboost
- 스태킹(Stacking) : 여러 모델을 학습시키고 예측결과를 새로운 데이터로 사용하여 메타 모델을 학습
📚 머신 러닝을 위한 라이브러리 (Scikit-learn)
- 다양한 머신러닝 알고리즘을 제공하며, 데이터 전처리, 모델 학습, 평가 및 예측을 위한 도구를 포함
설치
conda install scikit-learn
# conda를 사용하여 Scikit-learn 설치
pip install scikit-learn
# pip를 사용하여 Scikit-learn 설치
Scikit-learn 주요기능
- 데이터 전처리: 스케일링, 인코딩, 결측값 처리 등 다양한 데이터 전처리 기능을 제공합니다.
- 모델 학습: 회귀, 분류, 군집화 등 다양한 머신러닝 알고리즘을 제공합니다.
- 모델 평가: 교차 검증, 성능 평가 지표 등 모델 평가를 위한 도구를 제공합니다.
- 모델 예측: 학습된 모델을 사용하여 새로운 데이터에 대한 예측을 수행할 수 있습니다.
☑️ kaggle
📚 캐글이란?
- 데이터 과학 및 머신러닝 경진대회 플랫폼
- 데이터 사이언티스트 / 머신러닝 엔지니어들이 다양한 문제를 해결하고 데이터를 분석
- 모델을 개발하는데 필요한 데이터셋과 도구를 제공
📚 데이터셋 다운 받기
kaggle competitions download -c 데이터셋 이름
# 타이타닉 데이터셋 다운로드
unzip 데이터셋 이름.zip
# 다운로드된 파일 압축 해제
☑️ 데이터 전처리
📚 데이터 전처리란?
- 데이터 분석 및 머신러닝 모델링을 위해 데이터를 준비하는 과정
- 원시 데이터(raw data)는 종종 불완전하거나, 노이즈가 많거나, 형식이 일관되지 않아 직접 모델링에 사용하기 어려움
- 데이터 전처리는 데이터의 품질을 높이고, 분석 결과의 신뢰성을 확보하기 위한 필수적인 과정
☑️ 실습
📚 결측치
1. 제거
# 결측값이 포함된 행 제거
df_dropped_rows = df.dropna()
# 결측값이 포함된 열 제거
df_dropped_cols = df.dropna(axis=1)
2. 대체
# 결측값을 0으로 대체
df_filled = df.fillna(0)
# 결측값을 각 열의 평균값으로 대체
df_filled_mean = df.fillna(df.mean())
# 결측값을 각 열의 중간값으로 대체
df_filled_median = df.fillna(df.median())
# 결측값을 각 열의 최빈값으로 대체
df_filled_mode = df.fillna(df.mode().iloc[0])
📚 이상치
1. 확인 (IQR)
# 특정 열의 이상치 확인 (IQR 방법)
Q1 = df['column_name'].quantile(0.25)
Q3 = df['column_name'].quantile(0.75)
IQR = Q3 - Q1
# 이상치 범위 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 확인
outliers = df[(df['column_name'] < lower_bound) | (df['column_name'] > upper_bound)]
print(outliers)
2. 대체
# 이상치를 평균값으로 대체
mean_value = df['column_name'].mean()
df['column_name'] = df['column_name'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)
3. 제거
# 이상치 제거
df_no_outliers = df[(df['column_name'] >= lower_bound) & (df['column_name'] <= upper_bound)]
📚 중복 데이터
1. 확인
# 중복된 행 확인
print(df.duplicated().sum())
2. 제거
# 중복된 행 제거
df_no_duplicates = df.drop_duplicates()
📚 데이터 타입 변환
df['column_name'] = df['column_name'].astype(변환할 타입)
📚 인코딩
범주형 데이터 => 더미 변수
df_encoded = pd.get_dummies(df, columns=['category_column'])
📚 샘플링
# 데이터셋에서 50% 샘플 추출
df_sampled = df.sample(frac=0.5)
# 데이터셋에서 100개의 샘플 추출
df_sampled_n = df.sample(n=100)
☑️ 지도학습: 회귀모델
📚 지도학습이란?
- 정답이있고 정답을 데이터를 통해 학습하는 방법을 말한다.
📚 회귀 모델
- 연속적인(간단한) 값을 예측하는 모델 (키, 가격 등을 예측)
☑️선형회귀
- 선형회귀는 종속 변수와 하나 이상의 독립 변수 간의 선형 관계를 모델링 하는 방법입니다
- 독립변수의 수에 따라 단순 선형회귀와 다중 선형회귀로 나뉩니다
- 독립변수: 예측하기 위해 사용하는 정보
- 선형관계: 곱셈과 덧셈만으로 이루어진 관계
- 단순 선형회귀: B1 + B2 * 독립변수
- 다중 선형회귀 : B1 + B2 * 독립변수1 + B3 * 독립변수2 (독립변수가 여러개 들어가있어서)
- 가중치 (B1, B2, B3) = 학습(목적함수를 최소화한 B1과 B2를 찾는게 학습이다.)
- 목적함수(loss function): 예측값과 정답값 사이의 차이를 수치로 나타내는 것(값이 줄어들수록 가중치를 잘찾은 것)
목적함수에서 미분과 최적화함수를 사용해서 구한다.
미분에서 대표적으로 경사하강법이 있다.
경사하강법: 특정함수가 줄어드는 방향으로 특정변수들의 값을 업데이트 하는 방법
정리: 학습이란 머신러닝에는 가중치가 있고 이것들로 예측값이 결정 된다. 예측치와 실제값을 비교해서 얼마나 차이나는지 오차를 계산하고 이를 최소화 하기 위해 가중치를 바꿔가며 오차가 줄어들게 하여 정답에 가깝게하는 것이다.
한번에 최저값으로 만들지 않는 것은 비효율적이기 때문이다.
📚Scikit-learn을 사용한 선형 회귀 모델 구현 및 평가
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split #데이터 분할 기능
from sklearn.linear_model import LinearRegression #선형 모델을 가져오고 선형 회귀로 지정
from sklearn.metrics import mean_squared_error, r2_score #모델의 성능을 평가하는 메트릭을 가져온다.
데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
train_test_split(독립변수, 종속변수, 테스트의 비율, random_state값에 따라 데이터셋을 랜덤하게 분할하게 한다.)
선형모델 생성 및 실행
model = LinearRegression() #선형모델이 자동 생성
model.fit(X_train, y_train) #(테스트 데이터, 테스트 정답)넣어주면 자동으로 학습이 진행 된다.
- X_train: 모델이 학습할 때 사용할 입력 데이터(독립 변수들).
- y_train: 출력 데이터(종속 변수 또는 타겟값)입니다
예측
y_pred = model.predict(X_test) #값을 저장할 변수 생성 후 모델에서 predict함수 호출해 테스트할 독립변수를 넣어준다.
정확도 평가
mse = mean_squared_error(y_test, y_pred) #0에 가까울수록 좋다
r2 = r2_score(y_test, y_pred) #1에 가까울수록 좋다
☑️ 다항회귀
- 다항 회귀(Polynomial Regression)는 종속 변수와 독립 변수 간의 비선형 관계를 모델링하는 방법
- 독립변수의 다항식을 사용하여 관계를 모델링 합니다.
다항회귀 차수 선택
- 다항회귀 차수(degree) : 독립 변수의 최대 차수
- 차수가 높을수록 모델이 더 복잡해지며 과적합(overfitting)의 위험 존재 → 적절한 차수 선택 필요
📚 Scikit-learn을 사용한 다항 회귀 모델 구현 및 평가
import pansdas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures #Features의 차수를 선택해준다.
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
X = np.array([[1], [2], [3], [4], [5], [6]])
y = np.array([1, 4, 9, 16, 25, 36]) # 데이터 생성
poly = PolynomialFeatures(degree=2) #2차항까지 만들어주게 설정
X_poly = poly.fit_transform(X) #데이터를 만들어둔 Polynomial생성기에 전달해서 실제로 2차항으로 만든다.
X_poly를 실행해보면
array([[ 1., 1., 1.],
[ 1., 2., 4.],
[ 1., 3., 9.],
[ 1., 4., 16.],
[ 1., 5., 25.],
[ 1., 6., 36.]])
순서대로 0차항, 1차항, 2차항 값이 나온다.
X_train, X_test, y_train, y_test = train_test_split(X_poly, y, test_size=0.2, random_state=42)
#데이터 분할
model = LinearRegression()
model.fit(X_train, y_train)
#선형식을 넣는 이유: 위 poly = PolynomialFeatures(degree=2)에서 다항식을 만들어주었는데 이걸
LinearRegression()에 넣으면 다항회귀식으로 나타내주기 때문이다.
#Features을 생성해주는 것 만으로 선형회귀식을 다항회귀식으로 활용가능
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')
☑️ 로지스틱 회귀
- 종속 변수가 이진형일 때(즉, 결과가 두 가지 중 하나일 때) 사용되는 통계 기법
- 로지스틱 회귀는 선형 회귀와 달리 결과값이 0과 1 사이에 위치하게 하기 위해 시그모이드 함수(Sigmoid Function)를 사용합니다.
- 실제로는 분류모델에 사용한다.
로지스틱 회귀 사용 목적
- 로지스틱 회귀는 데이터를 학습하여 각 데이터 포인트가 특정 클래스에 속할 확률을 예측합니다.
- 예를 들어, 유방암 데이터에서는 환자가 암에 걸렸을 확률, 타이타닉 데이터 에서는 승객이 생존할 확률을 예측합니다.
로지스틱 회귀의 비용함수란?
- 로지스틱 회귀의 비용 함수는 모델의 예측 확률과 실제 레이블 사이의 차이를 측정합니다.
- 로그 손실 함수(Log Loss) 또는 크로스 엔트로피 손실 함수(Cross-Entropy loss)라고 불립니다.
- 확률을 높여주어야 한다.
- 값이 1에 가까울수록 정확한 값이다.(0에 가까우면 잘못한거다.)
개념
-m개는 데이터이다. 데이터 전체의 확률을 계산 한다.
-y(i)는 확률 ex)1
-h는 실제로 예측한 값 ex) 0.2
-로그 함수는 값이 작아질수록 굉장히 작은 값이 나온다.
-1 - y(i)는 실제로 아닐 확률 ex)0
📚 데이터 로드 및 전처리
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer # sklearn에 포함된 datasets중 사용할 load_breast_cancer데이터 가져오기
from sklearn.model_selection import train_test_split #test train을 나누기 위한 모듈 import
from sklearn.preprocessing import StandardScaler # StandardScaler는 데이터가있을 때 데이터의 분포를 맞춰주는 역할(데이터 정규화)
data = load_breast_cancer() # 데이터 로드
X = data.data #X에 Feature만 가져온다.
y = data.target #데이터 속에 타겟은 맞추기 위한 레이블만 포함 되어있어서 레이블만 가져온다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#데이터 분할
scaler = StandardScaler() #스케일러 적용해 스케일러 생성
X_train = scaler.fit_transform(X_train)
#만들어진 스케일러에 트레이닝 데이터를 fit해준다. 그러면 스케일러는 학습을 한다
#fit이라는건 학습을 말한다.
#스케일링을 하는 이유는 데이터가 있을때 표준과 표준편차를 정규분포를 따르도록 해주는것
#간단하게 데이터가 평균과 분산이 같도록 바꿔주는 작업
X_test = scaler.transform(X_test)
# X_train에 대해서 평균과 편차를 찾아 정규화 해준다.
# transform은 실제데이터에 적용하는 것을 말한다.
📚 모델학습
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# LogisticRegression 모델과 다양한 metrics 가져오기
모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)
예측
y_pred = model.predict(X_test)
평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
9강 강의자료 아래에 타이타닉 데이터를 활용한 전처리 내용 (내용이 길어서 작성은 X, 복습은 필수)
인코딩 부분에서 안좋은 예시로 들어있음 (데이터들을 너무 간단하게 0,1,2로 표현했기 때문)
# 특성과 타겟 분리
X = titanic.drop('survived', axis=1)
y = titanic['survived']
survived는 종속변수라서 학습에 필요X = y(종속변수로 지정)
타이타닉에서 열을 기준으로 survived분리/ 나머지는그대로 놔둔다.
☑️ 회고
1. 모델훈련에서 무엇을 보고 추가 제거를 하는거지?
2. 이상치 대체
df['column_name'] = df['column_name'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)
- 람다 함수lambda는 이름 없이 간단하게 한 줄로 함수를 정의
- lambda x: x는 column_name의 각 개별 값을 나타냅니다.
- if x < lower_bound or x > upper_bound: 만약 x가 lower_bound(하한값)보다 작거나 upper_bound(상한값)보다 큰 경우, 즉 값이 범위 밖에 있는 경우,
- mean_value: 그 값을 **평균값(mean_value)**으로 대체합니다.
- else x: 그렇지 않다면, 값은 변경하지 않고 그대로 유지됩니다.
3. 인코딩 부분 실습하면서 이해필요
4. 데이터 분할
train_test_split() 함수
- 이 함수는 주어진 데이터를 훈련용 데이터와 테스트용 데이터로 나눕니다. 훈련 데이터는 모델을 학습시키는 데 사용되고, 테스트 데이터는 모델의 성능을 평가하는 데 사용됩니다.
5. 정확도 평가
**MSE (Mean Squared Error)**와 **R² (R-squared, 결정계수)**는 회귀 모델의 성능을 평가하는 데 사용되는 지표입니다. 두 지표는 서로 다른 측면에서 모델의 정확도를 평가합니다.
r2 = r2_score(y_test, y_pred)
R²는 모델이 전체 변동을 얼마나 잘 설명하는지 나타내는 지표로, 타겟 변수의 변동성 중에서 독립 변수가 얼마나 설명할 수 있는지를 보여줍니다.
mse = mean_squared_error(y_test, y_pred)
평균 제곱 오차는 모델이 예측한 값과 실제 값 간의 차이를 평가하는 지표로, 그 차이(오차)의 제곱 평균을 계산합니다.
6. 모델 학습
accuracy_score, classification_report, confusion_matrix
7. .predict() 함수
1) 선형회귀
LinearRegression 모델에서 .predict()를 사용하면 주어진 입력 데이터에 대해 연속적인 값을 예측합니다.
2) 로지스틱 회귀
LogisticRegression에서 .predict()를 사용하면 주어진 데이터에 대한 클래스 라벨을 예측합니다. 로지스틱 회귀는 이진 또는 다중 클래스 분류를 수행할 수 있습니다.
3) 로지스틱 회귀에서 확율 예측
로지스틱 회귀와 같은 분류 모델에서는 .predict_proba() 메서드를 사용하여 각 클래스에 속할 확률을 예측할 수 있습니다.
'TIL' 카테고리의 다른 글
내일배움캠프 13일차 TIL + 비지도학습, 앙상블 학습, GIT (5) | 2024.10.16 |
---|---|
내일배움캠프 12일차 TIL + 지도학습, GITHUB (0) | 2024.10.15 |
내일배움캐프 10일차 TIL + 도전과제 (3) | 2024.10.11 |
내일배움캠프 9일차 TIL + 개인과제 2번 3번, 알게 된 것들/까먹은 것들 (2) | 2024.10.10 |
내일배움캠프 8일차 TIL + 판다스 심화 (3) | 2024.10.08 |