스터디 날짜: 11/10(월)~11/14(금)
스터디범위: PART 03, 모의고사 3, 4회 문제 제 1, 2유형
이번주 스터디 하면서 느낀 점: 기초적인 Pandas를 비롯해서 모듈을 불러오는 것부터 헷갈렸다. 또한 기출을 실제로 처음 풀어봤는데 생각했던 것보다 어려워서 열심히 해야 될 것같다.

지도학습 - 분류
- 분류의 대표적인 알고리즘
- 의사결정나무
- 로지스틱회귀
- 나이브베이즈
- 서포트벡터머신
- KNN
- 랜덤포레스트
- 신경망
-> 교재에서는 의사결정나무, KNN, SVM, 로지스틱 회귀, 랜덤포레스트를 이용한 분류 문제 예제 다룬다.
1. 의사결정나무를 이용한 분류 문제 해결
📌 목표: 타이타닉 데이터를 기반으로 Survived 컬럼의 값을 예측
-> 불필요한 속성은 제거하고 전처리 과저을 거친 후, 사이킷런의 의사결정나무 알고리즘을 이용하여 학습 모델을 구추한 후 예측 수행
# 1. 패키지 임포트
import numpy as np
import pandas as pd
import sklearn
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 2. 데이터 불러오기
df = pd.read_csv("https://raw.githubusercontent.com/YoungjinBD/dataset/main/titanic.csv")
df # 891개의 행과 12개의 열로 구성.
# 3. 데이터 살펴보기
# 결측치 존재하는지 확인
df.info() # Age, Cabin, Embarked 결측치 존재
# 기술통계 보기
df.describe()
# 4. 데이터 전처리
# Age: 평균으로 대치
age_mean = df['Age'].mean()
df['Age'].fillna(age_mean, inplace = True)
# Embarked: 최빈값으로 대치
df.groupby('Embarked').size()
embarked_mode = df['Embarked'].mode()[0] # index 조심
df['Embarked'].fillna(embarked_mode, inplace = True)
# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
df['Sex'] = LabelEncoder().fit_transform(df['Sex'])
df['Embarked'] = LabelEncoder().fit_transform(df['Embarked'])
# SibSp, Parch 를 더해서 FamilySize 라는 변수 만들기
df['FamilySize'] = df['SibSp'] + df['Parch']
df
# 5. 분석 데이트 셋 준비 - 학습용 데이터 셋과 테스트용 데이터 셋으로 분리
X = df[['Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'FamilySize']]
y = df['Survived']
X
y
# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 11)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
# 6. 데이터 분석 수행
dt = DecisionTreeClassifier(random_state = 11)
dt.fit(X_train, y_train)
pred = dt.predict(X_test)
# (1) 정확도 측정
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, pred)
print(acc)
# (2) 오차행렬을 통한 성능평가
from sklearn.metrics import confusion_matrix
mat =confusion_matrix(y_test, pred)
print(mat)
# (3) 평가지표 계산
from sklearn.metrics import classification_report
rpt = classification_report(y_test, pred)
print(rpt)
# 정밀도: 0.84 / 재현율 = 0.83
2. KNN을 이용한 분류 문제 해결
📌 목표: iris 데이터를 기반으로 붓꽃 품종 예측
Note. KNN은 K에 따라 예측의 정확도가 달라지므로 적절한 K값을 찾는 것이 중요! (모두 학습해서 정확도를 비교해보자.
# 1. 필요 패키지 임포트
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 2. 데이터 불러오기
df = pd.read_csv("https://raw.githubusercontent.com/YoungjinBD/dataset/main/iris.csv")
df
# 3. 데이터 살펴보기
df.info()
df.describe()
# 4. 데이터 정처리
# 4개의 독립변수에 대해 Min-Max 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['sepal_length']] = scaler.fit_transform(df[['sepal_length']])
df[['sepal_width']] = scaler.fit_transform(df[['sepal_width']])
df[['petal_length']] = scaler.fit_transform(df[['petal_length']])
df[['petal_width']] = scaler.fit_transform(df[['petal_width']])
# 5. 데이터 분석 준비
X = df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']]
y = df[['species']]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state= 11)
# 6. 데이터 분석 수행
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, y_train)
pred = knn.predict(X_test)
# (1) 모델 성능: 정확도
from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, pred)
print(acc)
# (2) 오차행렬
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(y_test, pred)
print(mat)
# (3) 평가지표 계산
from sklearn.metrics import classification_report
rpt = classification_report(y_test, pred)
print(rpt)
3. SVM을 이용한 분류 문제 해결
- 다양한 커널을 사용해서 특성에 맞는 분류 수행
- 비교적 적은 학습데이터로도 정확도가 높은 분류 기대
- 변수가 많은경우 경계 결정 및 데이터의 시각화가 어려워 분류결과의 이해가 어려움.
# 1. 필요 패키지 임포트
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import svm
# 2. 데이터 불러오기
df = pd.read_csv("https://raw.githubusercontent.com/YoungjinBD/dataset/main/titanic.csv")
df
# 3. 데이터 살펴보기
df.info()
df.describe()
# 4. 데이터 전처리
# Age: 평균으로 대치
age_mean = df['Age'].mean()
df['Age'].fillna(age_mean, inplace = True)
# Embarked: 최빈값으로 대치
df.groupby('Embarked').size()
embarked_mode = df['Embarked'].mode()[0] # index 조심
df['Embarked'].fillna(embarked_mode, inplace = True)
# FamilySize 생성
df['FamilySize'] = df['SibSp'] + df['Parch']
# Sex: 원핫 인코딩
onehot_sex = pd.get_dummies(df['Sex'])
df = pd.concat([df, onehot_sex], axis = 1)
# Embarked 원핫 인코딩
onehot_embarked = pd.get_dummies(df['Embarked'])
df = pd.concat([df, onehot_embarked], axis = 1)
df
# 5. 분석 데이터셋 준비
X = df[["Pclass","Age","Fare","FamilySize","female","male","C","Q","S"]]
y = df["Survived"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10)
# 6. 데이터 분석 수행
from sklearn import svm
sv = svm.SVC(kernel = 'rbf')
# sv = svm.SVC(kernel = 'rbf', C = 1, gamma = 0.1) #kernel 조정
# sv = svm.SVC(kernel = 'linear', C = 1, gamma = 0.1)
sv.fit(X_train, y_train)
pred = sv.predict(X_test)
# 정확도, 오차행렬, 분석결과 출력
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
acc = accuracy_score(y_test, pred)
print(acc)
mat = confusion_matrix(y_test, pred)
print(mat)
rpt = classification_report(y_test, pred)
print(rpt)