인공지능/공부

고급 인공지능 활용 과제 4 - knn, 결정트리, 로지스틱 회귀

이게될까 2024. 4. 13. 21:21
728x90
728x90

로지스틱 및 KNN은 과제 3에서 진행했으므로 빠르게 결과를 볼 수 있도록 진행한다.

로지스틱 회귀

import pandas as pd
from google.colab import drive
drive.mount('/content/drive')
data = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/titanic.csv')
data = data.drop(['Name','Ticket'],axis=1) # 이름과 티켓 값은 생존과 관련 없기 때문이다.
data = pd.get_dummies(data,columns=['Sex','Embarked'],drop_first = True)# 데이터 세분화 하면서 데이터 갯수 줄이기 (남자 여자에서 하나 지우고, 3개중에 하나 지우기)
data.head()

data.corr() # 데이터 간의 관계 확인하기

data['family'] = data['SibSp'] + data['Parch'] # 가족을 한곳에 모으기
data.drop(['SibSp','Parch'],axis = 1, inplace = True)
data.corr() # 데이터 간의 관계 확인하기 전 보다는 올랐다.

로지스틱 회귀 예측

from sklearn.model_selection import train_test_split
X = data.drop('Survived', axis = 1)
y = data['Survived']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2, random_state=100)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train,y_train)
pred = model.predict(X_test)
from sklearn.metrics import accuracy_score
accuracy_score(y_test,pred)

점수 79.2점이다.

knn

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from google.colab import drive
drive.mount('/content/drive')
data = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/titanic.csv')
data.info()

data = data.drop(['Name','Ticket'],axis=1) # 이름과 티켓 값은 생존과 관련 없기 때문이다.
data = pd.get_dummies(data,columns=['Sex','Embarked'],drop_first = True)# 데이터 세분화 하면서 데이터 갯수 줄이기 (남자 여자에서 하나 지우고, 3개중에 하나 지우기)
data['family'] = data['SibSp'] + data['Parch'] # 가족을 한곳에 모으기
data.drop(['SibSp','Parch'],axis = 1, inplace = True)
data.head()

과제 3에서 제일 높은 점수가 나왔던 최대 최소 스케일링

from sklearn.preprocessing import MinMaxScaler
mm_scaler = MinMaxScaler()
mm_scaled = mm_scaler.fit_transform(data)
mm_scaled = pd.DataFrame(mm_scaled, columns = data.columns)
round(mm_scaled.describe(),2)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(data.drop('Survived',axis=1),data['Survived'],test_size=0.2, random_state=100)
mm_scaler = MinMaxScaler()
X_train_scaled = mm_scaler.fit_transform(X_train)
X_test_scaled = mm_scaler.fit_transform(X_test)
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train_scaled,y_train)
pred = knn.predict(X_test_scaled)
from sklearn.metrics import accuracy_score
accuracy_score(y_test,pred)

0.7921348314606742

k_param = range(1,11)
test_acc_list = []

for k in k_param:
  knn = KNeighborsClassifier(n_neighbors= k) 
  knn.fit(X_train_scaled,y_train)
  pred = knn.predict(X_test_scaled)
  test_acc_list.append(accuracy_score(y_test,pred))
  dic = {'k': k_param, 'accuracy': test_acc_list}
acc_df = pd.DataFrame(dic)
acc_df

로지스틱 회귀는 79.2점이 나왔고 knn은 최대최소 스케일링에서 k=9일 때 85.4이 나왔다

결정 트리 알고리즘

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from google.colab import drive
drive.mount('/content/drive')
data = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/titanic.csv')
data.info()

data['Survived'].unique() # array([0, 1])


data = data.drop(['Name','Ticket'],axis=1) # 이름과 티켓 값은 생존과 관련 없기 때문이다.
data = pd.get_dummies(data,columns=['Sex','Embarked'],drop_first = True)# 데이터 세분화 하면서 데이터 갯수 줄이기 (남자 여자에서 하나 지우고, 3개중에 하나 지우기)
data['family'] = data['SibSp'] + data['Parch'] # 가족을 한곳에 모으기
data.drop(['SibSp','Parch'],axis = 1, inplace = True)
data.head()

data.info()

from sklearn.model_selection import train_test_split # 훈련셋 분리
X_train, X_test, y_train, y_test = train_test_split(data.drop('Survived', axis=1), data['Survived'], test_size=0.2, random_state=100)

from sklearn.tree import DecisionTreeClassifier #리그레쉬 : 값을 예측 , 클레스파이어: 분류 
model = DecisionTreeClassifier() # 모델 형성
model.fit(X_train, y_train) # 훈련하기
pred = model.predict(X_test) # 예측하기
from sklearn.metrics import accuracy_score # 예측 점수 
accuracy_score(y_test, pred)

0.797752808988764

model = DecisionTreeClassifier(max_depth=5) # 매개변수 지정 (하이퍼 파라미터) 트리의 깊이이다.
model.fit(X_train, y_train)
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)
print('Train score:', accuracy_score(y_train, train_pred))
print('Test score:', accuracy_score(y_test, test_pred)) # 테스트 점수가 증가했다. 

Train score: 0.8410689170182841
Test score: 0.8426966292134831

model = DecisionTreeClassifier(max_depth=6) # 6일경우
model.fit(X_train, y_train)
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)
print('Train score:', accuracy_score(y_train, train_pred))
print('Test score:', accuracy_score(y_test, test_pred)) # 5에 비해 테스트 점수가 감소했다.

Train score: 0.8593530239099859
Test score: 0.8202247191011236

model = DecisionTreeClassifier(max_depth=7) # 7일경우
model.fit(X_train, y_train)
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)
print('Train score:', accuracy_score(y_train, train_pred))
print('Test score:', accuracy_score(y_test, test_pred)) # 5에 비해 테스트 점수가 감소했다.

Train score: 0.8748241912798875
Test score: 0.8146067415730337

model = DecisionTreeClassifier(max_depth=4) # 4일경우
model.fit(X_train, y_train)
train_pred = model.predict(X_train)
test_pred = model.predict(X_test)
print('Train score:', accuracy_score(y_train, train_pred))
print('Test score:', accuracy_score(y_test, test_pred)) # 5에 비해 테스트 점수가 감소했다.

Train score: 0.8354430379746836
Test score: 0.8258426966292135

knn(85.4)이 로지스틱 회귀(79.2), 결정트리 알고리즘의 점수(84.3)에 비해 제일 높다.

knn이 제일 높은 이유는 로지스틱 회귀는 독립변수와 예측 변수의 선형 관계를 전제로 하여 이러한 전제를 벗어나는 데이터에는 좋은 예측을 보여주지 못하는데 나이와 출항지가 이러한 예측에 방해를 주었다.
또한 결정 트리 알고리즘에 비해 높은 점수인 이유 또한 앞과 같고, 결정 트리가 설명력이 높아 예측력이 낮은 것에 있는 것 같다.
결정트리의 점수가 로지스틱 회귀에 비해 높은 이유는 타이타닉은 성별에 관련해서 확실하게 살고 죽고가 분류되고, 아웃라이어에 대해 크게 영향받지 않았으며, 데이터에 가정이 없기 때문이다. 나이에 대한 최적의 변수와, 성별이라는 기준점이 명확했기 때문에 높은 점수가 나온 것 같다.

728x90