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이 로지스틱 회귀보다 높은 점수가 나온 이유는 로지스틱 회귀는 독립변수와 예측 변수의 선형 관계를 전제로 하여 이러한 전제를 벗어나는 데이터에는 좋은 예측을 보여주지 못하는데 나이와 출항지가 이러한 예측에 방해를 주었다.
'인공지능 > 공부' 카테고리의 다른 글
고급 인공지능 활용 과제 5 - 분류하기, 클러스터링 (0) | 2024.04.13 |
---|---|
고급 인공지능 활용 과제 4 - knn, 결정트리, 로지스틱 회귀 (0) | 2024.04.13 |
고급 인공지능 활용 hw 1 - 단순 파이썬, numpy (0) | 2024.04.13 |
transformer, attention 정리 3 (0) | 2024.04.11 |
transformer, attention 정리 2 (0) | 2024.04.11 |