[영진닷컴 X BDA 빅분기 실기 스터디] 2주차

My_oyster_house·2024년 11월 15일

학습범위
[2유형] 데이터 분석 : 지도학습 - 분류 학습 (교재 112p ~ 153p)
[2유형] 데이터 분석 : 지도학습 - 회귀 학습 (교재 154p ~ 177p)
과제

이번 스터디 분량은 지도 학습 (분류와 회귀) 이다.

지도 학습 개요

지도 학습은 분류회귀(예측)으로 나뉩니다.

  • 분류: 결과 값은 카테고리
  • 회귀: 결과 값은 수치

분류

  • 이진 분류다중 분류로 나뉨
  • 주요 알고리즘:
    • 의사결정나무
    • KNN (K-Nearest Neighbor)
    • 로지스틱 회귀
    • 랜덤포레스트
    • 나이브베이즈
    • 신경망(Neural Network)
    • SVM (Support Vector Machine)

1. 지도 학습 - 분류

1) 의사결정 나무

  • 특징:
    • 수치 데이터, 범주 데이터 모두 사용 가능
    • 과대적합 및 과소적합 주의 필요
  • 랜덤포레스트: 부트스트래핑 기반 샘플링과 배깅을 활용한 앙상블 학습

타이타닉 생존자 분류 분석


# 필요 패키지 임포트
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
import pandas as pd

# 데이터 로드
df = pd.read_csv("titanic.csv")

# 결측값 처리
df["Age"].fillna(df["Age"].mean(), inplace=True)
df["Embarked"].fillna(df["Embarked"].mode()[0], inplace=True)

# 레이블 인코딩
df["Sex"] = LabelEncoder().fit_transform(df["Sex"])
df["Embarked"] = LabelEncoder().fit_transform(df["Embarked"])

# 파생 변수 생성
df["FamilySize"] = df["SibSp"] + df["Parch"]

# 데이터셋 준비
X = df[["Pclass", "Sex", "Age", "Embarked", "Fare", "FamilySize"]]
y = df["Survived"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=11)

# 모델 생성 및 학습
dt = DecisionTreeClassifier(random_state=11)
dt.fit(X_train, y_train)

# 예측 및 정확도 측정
pred = dt.predict(X_test)
acc = accuracy_score(y_test, pred)
print(f"Accuracy: {acc}")

2) KNN (K-Nearest Neighbor)

  • 특징:
    • 가까운 K개의 데이터의 정답을 참조하여 분류
    • 데이터 표준화 필요
    • 차원이 클수록 연산량 증가
  • K값 설정:
    • 여러 값으로 실험 후 가장 성능이 좋은 값 선택

붓꽃 데이터 분류 분석


from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import pandas as pd

# 데이터 로드
df = pd.read_csv("iris.csv")

# 데이터 정규화
scaler = MinMaxScaler()
df[["sepal_length", "sepal_width", "petal_length", "petal_width"]] = scaler.fit_transform(
    df[["sepal_length", "sepal_width", "petal_length", "petal_width"]])

# 데이터셋 준비
X = df[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
y = df["species"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=11)

# KNN 모델 생성 및 학습
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 예측 및 정확도 측정
pred = knn.predict(X_test)
acc = accuracy_score(y_test, pred)
print(f"K=3 Accuracy: {acc}")

3) SVM (Support Vector Machine)

  • 특징:
    • 고차원 공간에서 데이터를 분류
    • 커널 트릭을 활용하여 비선형 데이터 분류 가능
    • 비교적 적은 데이터로도 높은 정확도

타이타닉 생존자 분류 분석

from sklearn import svm
from sklearn.model_selection import train_test_split
import pandas as pd

# 데이터 로드 및 전처리
df = pd.read_csv("titanic.csv")
df["Age"].fillna(df["Age"].mean(), inplace=True)
df["Embarked"].fillna(df["Embarked"].mode()[0], inplace=True)

# 레이블 인코딩
df = pd.get_dummies(df, columns=["Sex", "Embarked"])

# 데이터셋 준비
X = df[["Pclass", "Age", "Fare", "FamilySize", "Sex_female", "Sex_male", "Embarked_C", "Embarked_Q", "Embarked_S"]]
y = df["Survived"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# SVM 모델 생성 및 학습
sv = svm.SVC(kernel="rbf", C=1, gamma=0.1)
sv.fit(X_train, y_train)

# 예측 및 평가
pred = sv.predict(X_test)
acc = accuracy_score(y_test, pred)
print(f"Accuracy: {acc}")

2. 지도 학습 - 회귀

1) 단순 선형 회귀

  • 독립변수 xx와 종속변수 yy 간의 관계를 나타내는 선형식:
    y=ax+by = ax + b
  • 잔차(Residual): 실제값과 예측값의 차이

자동차 연비 예측

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
import pandas as pd

# 데이터 로드
df = pd.read_csv("mpg.csv")
df.dropna(inplace=True)

# 데이터셋 준비
X = df[["weight"]]
y = df["mpg"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 선형 회귀 모델 생성 및 학습
lr = LinearRegression()
lr.fit(X_train, y_train)

# 예측 및 평가
pred = lr.predict(X_test)
score = r2_score(y_test, pred)
print(f"R^2 Score: {score}")

2) 다중 선형 회귀

  • 여러 독립변수와 종속변수 간의 관계를 나타내는 선형식:
    y=a1x1+a2x2++by = a_1x_1 + a_2x_2 + \cdots + b

주택 가격 예측

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
import pandas as pd

# 데이터 로드
df = pd.read_csv("housing.csv")
df.dropna(inplace=True)

# 데이터셋 준비
X = df.drop("median_house_value", axis=1)
y = df["median_house_value"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 선형 회귀 모델 생성 및 학습
lr = LinearRegression()
lr.fit(X_train, y_train)

# 예측 및 평가
pred = lr.predict(X_test)
score = r2_score(y_test, pred)
print(f"R^2 Score: {score}")


3) 의사결정 나무 (회귀)

  • 분류 문제에서 사용한 의사결정 나무와 유사하지만, 범주를 예측하는 것이 아니라 연속형 값을 예측
  • 평균제곱오차(MSE, Mean Squared Error)를 통해 모델 성능 평가

주택 가격 예측 (캘리포니아 인구 통계 데이터)

from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import pandas as pd

# 데이터 로드 및 전처리
df = pd.read_csv("housing.csv")
df.dropna(inplace=True)
df = df.drop("ocean_proximity", axis=1)  # 범주형 변수 제거

# 데이터셋 준비
X = df.drop("median_house_value", axis=1)
y = df["median_house_value"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 의사결정 나무 (회귀) 모델 생성 및 학습
dtr = DecisionTreeRegressor(max_depth=3, random_state=42)
dtr.fit(X_train, y_train)

# 예측 및 평가
pred = dtr.predict(X_test)
mse = mean_squared_error(y_test, pred)
print(f"Mean Squared Error: {mse}")

4) 랜덤 포레스트 (회귀)

  • 다수의 의사결정 나무를 앙상블 방식으로 결합하여 예측
  • 랜덤 샘플링과 배깅(Bagging)을 통해 과적합 방지

주택 가격 예측 (캘리포니아 인구 통계 데이터)

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import pandas as pd

# 데이터 로드 및 전처리
df = pd.read_csv("housing.csv")
df.dropna(inplace=True)
df = df.drop("ocean_proximity", axis=1)  # 범주형 변수 제거

# 데이터셋 준비
X = df.drop("median_house_value", axis=1)
y = df["median_house_value"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 랜덤 포레스트 모델 생성 및 학습
rfr = RandomForestRegressor(n_estimators=100, max_depth=3, random_state=42)
rfr.fit(X_train, y_train)

# 예측 및 평가
train_pred = rfr.predict(X_train)
test_pred = rfr.predict(X_test)
train_mse = mean_squared_error(y_train, train_pred)
test_mse = mean_squared_error(y_test, test_pred)
print(f"Train MSE: {train_mse}")
print(f"Test MSE: {test_mse}")

5) 로지스틱 회귀 (분류)

  • 로지스틱 회귀는 특정 분류 항목에 속할 확률을 예측하는 모델
  • 시그모이드 함수(sigmoid function)를 활용하여 출력값을 0~1 사이 확률로 변환:
    y=11+e(wx+b)y = \frac{1}{1 + e^{-(w \cdot x + b)}}

붓꽃 데이터 분류 분석

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import accuracy_score
import pandas as pd

# 데이터 로드
df = pd.read_csv("iris.csv")

# 데이터 정규화
scaler = MinMaxScaler()
df[["sepal_length", "sepal_width", "petal_length", "petal_width"]] = scaler.fit_transform(
    df[["sepal_length", "sepal_width", "petal_length", "petal_width"]])

# 데이터셋 준비
X = df[["sepal_length", "sepal_width", "petal_length", "petal_width"]]
y = df["species"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=11)

# 로지스틱 회귀 모델 생성 및 학습
lr = LogisticRegression()
lr.fit(X_train, y_train)

# 예측 및 평가
pred = lr.predict(X_test)
acc = accuracy_score(y_test, pred)
print(f"Accuracy: {acc}")

6) 랜덤 포레스트 (분류)

  • 랜덤 포레스트는 다수의 의사결정 나무를 결합한 앙상블 학습 기법
  • 서로 다른 샘플링과 특성을 가진 트리들을 결합하여 일반화 성능 향상

타이타닉 생존자 분류 분석

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
import pandas as pd

# 데이터 로드 및 전처리
df = pd.read_csv("titanic.csv")
df["Age"].fillna(df["Age"].mean(), inplace=True)
df["Embarked"].fillna(df["Embarked"].mode()[0], inplace=True)

# 레이블 인코딩
df["Sex"] = LabelEncoder().fit_transform(df["Sex"])
df["Embarked"] = LabelEncoder().fit_transform(df["Embarked"])

# 파생 변수 생성
df["FamilySize"] = df["SibSp"] + df["Parch"]

# 데이터셋 준비
X = df[["Pclass", "Sex", "Age", "Embarked", "Fare", "FamilySize"]]
y = df["Survived"]

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=11)

# 랜덤 포레스트 모델 생성 및 학습
rf = RandomForestClassifier(n_estimators=50, max_depth=3, random_state=42)
rf.fit(X_train, y_train)

# 예측 및 평가
pred = rf.predict(X_test)
acc = accuracy_score(y_test, pred)
print(f"Accuracy: {acc}")
profile
kwonhs.alice@gmail.com

0개의 댓글