인공지능/공부

고급 인공지능 활용 과제 3 - 로지스틱 회귀, KNN 알고리즘, 스케일링

이게될까 2024. 4. 13. 20:20
728x90
728x90
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)
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)

0.7865168539325843

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()

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 889 entries, 0 to 888
Data columns (total 9 columns):

Column Non-Null Count Dtype


0 Pclass 889 non-null int64
1 Name 889 non-null object
2 Sex 889 non-null object
3 Age 889 non-null float64
4 SibSp 889 non-null int64
5 Parch 889 non-null int64
6 Ticket 889 non-null object
7 Embarked 889 non-null object
8 Survived 889 non-null int64
dtypes: float64(1), int64(4), object(4)
memory usage: 62.6+ KB

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()
sns.barplot(x=data['Survived'].value_counts().index,y = data['Survived'].value_counts())

표준화 스케일링

from sklearn.preprocessing import StandardScaler
st_scaler = StandardScaler()
st_scaler.fit(data)
st_scaled = st_scaler.transform(data)
st_scaled = pd.DataFrame(st_scaled,columns = data.columns)
st_scaled
round(st_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)
st_scaler = StandardScaler()
X_train_scaled = st_scaler.fit_transform(X_train)
X_test_scaled = st_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.7752808988764045

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

최소 최대 스케일링

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)
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.8146067415730337

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

로버스트 스케일링

from sklearn.preprocessing import RobustScaler
rb_scaler= RobustScaler()
rb_scaled = rb_scaler.fit_transform(data) # 한번에 진행 스케일링과 변환
rb_scaled = pd.DataFrame(rb_scaled,columns = data.columns)
round(rb_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)
rb_scaler = RobustScaler()
X_train_scaled = rb_scaler.fit_transform(X_train)
X_test_scaled = rb_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.7752808988764045

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

혹시 몰라 제일 높은 최대 최소 스케일에서 멘허튼 방식으로 한번 더 해본다.

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)
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
from sklearn.metrics import accuracy_score
k_param = range(1,11)
test_acc_list = []

for k in k_param:
  knn = KNeighborsClassifier(p=2,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

분석결과

로지스틱 회귀에선 78점이 나왔고
knn에선 최소 최대 스케일의 파라미터를 8개로 해줬을 때 제일 높은 85점이 나왔다.

성별이 생존율에 제일 큰 영향을 줬는데 그 분포가 바뀌지 않은 최소 최대 스케일링이 knn에서 제일 좋은 점수가 나온 이유이다.
또한 knn이 로지스틱 회귀보다 높은 점수가 나온 이유는 로지스틱 회귀는 독립변수와 예측 변수의 선형 관계를 전제로 하여 이러한 전제를 벗어나는 데이터에는 좋은 예측을 보여주지 못하는데 나이와 출항지가 이러한 예측에 방해를 주었다.

728x90