본문 바로가기
PYTHON

20200326 - 파이썬 머신러닝 - 타이타닉 생존자 예측

by 낫싱 2020. 3. 26.
728x90
반응형

ml_머신러닝 기반 데이터 분석_평가_0326호지수 - Jupyter Notebook.pdf
0.33MB
ml_모델링평가_0326호지수 - Jupyter Notebook.pdf
0.60MB
ml_머신러닝 기반 데이터 분석_평가_0326호지수.ipynb
0.02MB
ml_모델링평가_0326호지수.ipynb
0.10MB

  • 오른쪽 정렬왼쪽 정렬가운데 정렬

  •  

  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import pandas as pd

import numpy as np

 

pd.set_option('display.max_columns', 15)

titanic_df=pd.read_csv('titanic3.csv')

 

from sklearn.preprocessing import LabelEncoder

# Null 처리 함수

def fillna(df):

df['age'].fillna(df['age'].mean(), inplace=True)

df['cabin'].fillna('N', inplace=True)

df['fare'].fillna(df['fare'].mean(), inplace=True)

df['embarked'].fillna('N', inplace=True)

return df

 

def drop_features(df):

df.drop(['home.dest','boat','body','name','ticket'], axis=1, inplace=True)

return df

 

def format_features(df):

df['cabin'] = df['cabin'].str[:1]

features = ['cabin','sex','embarked']

for feature in features:

le = LabelEncoder()

df[feature] = le.fit_transform(df[feature])

return df

 

def transform_features(df):

df = fillna(df)

df = drop_features(df)

df = format_features(df)

return df

 

t_df = transform_features(titanic_df)

t_df.to_pickle('t_df.pkl')

display(t_df.head())

display(t_df.columns.values)

 

from sklearn import preprocessing

from sklearn.model_selection import train_test_split

 

# 독립변수, 종속변수 분리

X = t_df[['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'cabin', 'embarked']]

y = t_df['survived']

 

# 독립변수 정규화(평균 0, 분산1인 표준정규분포)

X = preprocessing.StandardScaler().fit(X).transform(X) # StandardScaler : 표준정규분포

 

# 학습용 데이터와 평가용 데이터를 8:2로 분리

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)

 

print(X_train.shape) # (1047, 8) 80% 데이터 갯수

print(X_test.shape) # (262, 8) 20% 데이터 갯수

print()

print(X.mean()) # -4.885320566723378e-17 (0.0 이 17개 있어서 거의 0이라고 보면 된다.)-> 평균 = 0

print(X.std()) # 1.0 표준편차

print(type(y_test)) # <class 'pandas.core.series.Series'>

 

# Decision Tree

from sklearn.metrics import accuracy_score

from sklearn.tree import DecisionTreeClassifier

 

dt_model = DecisionTreeClassifier() # 객체 생성

dt_model.fit(X_train, y_train) # 트레이닝 데이터로 학습

dt_pred = dt_model.predict(X_test) # 검증용 데이터로 예측

 

print(dt_pred[0:10]) # 예측값과

print(y_test.values[0:10]) # 실제 y 값을 대조하며 검증

 

accuracy = accuracy_score(y_test, dt_pred)

print('dt 예측 정확도:',accuracy) # 예측 정확도가 좋지 못하면 재개발 해야함

# 분석용 데이터셋을 잘 만들어서, 중요한 변수들을 뽑아내야 함.

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가

열 너비 조절

행 높이 조절

 

pclass

survived

sex

age

sibsp

parch

fare

cabin

embarked

0

1

1

0

29.00

0

0

211.3375

1

3

1

1

1

1

0.92

1

2

151.5500

2

3

2

1

0

0

2.00

1

2

151.5500

2

3

3

1

0

1

30.00

1

2

151.5500

2

3

4

1

0

0

25.00

1

2

151.5500

2

3

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

array(['pclass', 'survived', 'sex', 'age', 'sibsp', 'parch', 'fare', 'cabin', 'embarked'], dtype=object)

(1047, 8) (262, 8) -4.885320566723378e-17 1.0 <class 'pandas.core.series.Series'> [0 1 0 0 0 0 0 1 0 0] [1 0 0 1 0 0 0 1 1 0] dt 예측 정확도: 0.7519083969465649

In [2]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# Random Forest (투표를 해가며 결정해가는 방법)

from sklearn.ensemble import RandomForestClassifier #(분류기)

 

rf_model = RandomForestClassifier() # 객체 생성

rf_model.fit(X_train, y_train) # 학습을 시킨다. (트레이닝 데이터를 이용)

rf_pred = rf_model.predict(X_test) # 학습시킨 모델을 통해 예측한다. (검증용 데이터로)

 

rf_accuracy = accuracy_score(y_test, rf_pred) # 예측한 것과 실제 y값으로 비교해서 예측 정확도를 구한다.

print('rf 예측 정확도:', rf_accuracy) # 예측 정확도 출력

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

rf 예측 정확도: 0.767175572519084

In [3]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# Logistic Regression

from sklearn.linear_model import LogisticRegression

 

lr_model = LogisticRegression() # 객체 생성

lr_model.fit(X_train, y_train) # 생성된 객체에 학습

lr_pred = lr_model.predict(X_test) # 학습된 모델을 통해 예측

 

lr_accuracy = accuracy_score(y_test, lr_pred) # 예측한 것과 실제 y값으로 비교해서 예측 정확도를 구한다.

print('lr 예측 정확도:', lr_accuracy) # 예측 정확도 출력

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

lr 예측 정확도: 0.7748091603053435

In [4]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# KNN

from sklearn.neighbors import KNeighborsClassifier

 

k_model = KNeighborsClassifier(n_neighbors=5) # 최근접 이웃이 5개인 것을 의미한다.

k_model.fit(X_train, y_train)

k_pred = k_model.predict(X_test)

 

k_accuracy = accuracy_score(y_test, k_pred)

print('k 예측 정확도:', k_accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

k 예측 정확도: 0.7709923664122137

In [5]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# SVM

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

from sklearn.metrics import classification_report

from sklearn import svm

# 벡터 공간으로 매핑하는 함수를 커널이라고 함

# kernal = 'rbf' 옵션으로 RBF(Radial Basis Function) 함수를 적용

svm_model = svm.SVC(kernel='rbf', random_state=0) # random_state=0 으로 정해서 예측치 변동이 생기지 않게 한다.

# kernel : 구분하는 선을 기준으로 선과 데이터의 거리가 margin이다.

# 하지만, 하나의 선으로 분류할 수 있는 경우는 거의 없기 때문에 1차원을 2차원으로 만들고, 2차원을 3차원으로 만든다.

# 선을 차원으로 바꿔주는 것이 kernel.

svm_model.fit(X_train, y_train)

s_pred = svm_model.predict(X_test)

 

s_accuracy = accuracy_score(y_test, s_pred)

print('s 예측 정확도 :', s_accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

s 예측 정확도 : 0.8015267175572519

load_breat_cancer 데이터 세트를 불러와서 다음 사항을 수행하세요.

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()

데이터 세트의 구성 요소를 파악하고 feature의 개수를 구하세요.

cancer.data를 데이터 프레임으로 변환

정규화 수행

학습용 데이터와 검증용 데이터를 7:3의 비율로 구분

Decision Tree, Logistic Regression, Random Forest 기법을 활용하여 분류예측을 각각 수행

나의 풀이

In [6]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import pandas as pd

import numpy as np

 

from sklearn.preprocessing import LabelEncoder

from sklearn import preprocessing

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

from sklearn.datasets import load_breast_cancer

from sklearn.metrics import accuracy_score

from sklearn.tree import DecisionTreeClassifier

from sklearn import tree

import matplotlib.pyplot as plt

%matplotlib inline

 

cancer = load_breast_cancer()

cancer.keys() # ['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']

 

X = preprocessing.StandardScaler().fit(X).transform(X) # StandardScaler : 표준정규분포

 

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3, random_state=0)

 

dt_clf = DecisionTreeClassifier(random_state=0)

dt_clf = DecisionTreeClassifier(criterion='gini', max_depth=2, random_state=0)

 

dt_clf.fit(X_train, y_train)

 

y_hat = dt_clf.predict(X_test)

 

plt.figure(figsize=(8,6))

tree.plot_tree(dt_clf, filled=True, # 그림을 그린다.

feature_names=cancer.feature_names, # iris_data가 가지고 있는 데이터를 입력한다.

class_names=cancer.target_names, # iris_data가 가지고 있는 데이터를 입력한다.

rounded=True, fontsize=10) # 사각형의 모서리 라운드처리, 글자 사이즈

plt.show()

plt.close()

 

dt_model = DecisionTreeClassifier() # 객체 생성

dt_model.fit(X_train, y_train) # 트레이닝 데이터로 학습

dt_pred = dt_model.predict(X_test) # 검증용 데이터로 예측

 

accuracy = accuracy_score(y_test, dt_pred)

print('Decision Tree 예측 정확도:',accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

대표사진 삭제

사진 설명을 입력하세요.

Decision Tree 예측 정확도: 0.9298245614035088

In [7]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

df_cancer=pd.DataFrame(cancer.data , columns=cancer.feature_names )

# cancer.data 는 우리가 아는 데이터가 배열로 들어있고

# columns=cancer.feature_names의 feature는 독립변수들(데이터들의 컬럼들)

# 불러온 데이터는 'key : 배열' 형태로 들어있고, 이것을 dataframe으로 변경해주었다.

print('feature 개수 :',len(cancer.feature_names))

display(df_cancer.head(3))

display(df_cancer.shape)

# display(cancer.target)

display(pd.Series(cancer.target).value_counts()) # 시리즈형태만 밸류카운츠 가능

display(cancer.target_names)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

feature 개수 : 30

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 10열 선택10열 다음에 열 추가
  • 11열 선택11열 다음에 열 추가
  • 12열 선택12열 다음에 열 추가
  • 13열 선택13열 다음에 열 추가
  • 14열 선택14열 다음에 열 추가
  • 15열 선택15열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

mean radius

mean texture

mean perimeter

mean area

mean smoothness

mean compactness

mean concavity

...

worst area

worst smoothness

worst compactness

worst concavity

worst concave points

worst symmetry

worst fractal dimension

0

17.99

10.38

122.8

1001.0

0.11840

0.27760

0.3001

...

2019.0

0.1622

0.6656

0.7119

0.2654

0.4601

0.11890

1

20.57

17.77

132.9

1326.0

0.08474

0.07864

0.0869

...

1956.0

0.1238

0.1866

0.2416

0.1860

0.2750

0.08902

2

19.69

21.25

130.0

1203.0

0.10960

0.15990

0.1974

...

1709.0

0.1444

0.4245

0.4504

0.2430

0.3613

0.08758

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

3 rows × 30 columns

(569, 30)

1 357 0 212 dtype: int64

array(['malignant', 'benign'], dtype='<U9')

In [8]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# Logistic Regression

from sklearn.linear_model import LogisticRegression

import warnings

warnings.filterwarnings('ignore')

 

lr_model = LogisticRegression() 

lr_model.fit(X_train, y_train)

lr_pred = lr_model.predict(X_test)

 

lr_accuracy = accuracy_score(y_test, lr_pred)

print('lr 예측 정확도:', lr_accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

lr 예측 정확도: 0.9532163742690059

In [9]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# Random Forest

from sklearn.ensemble import RandomForestClassifier

 

rf_model = RandomForestClassifier()

rf_model.fit(X_train, y_train)

rf_pred = rf_model.predict(X_test)

 

rf_accuracy = accuracy_score(y_test, rf_pred)

print('rf 예측 정확도:', rf_accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

rf 예측 정확도: 0.9590643274853801

선생님 풀이

In [10]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 정규 분포 형태의 표준 스케일링 적용 후 train, test set 분리

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

# minmaxScaler 정규화(개별값/ 최대값)

# standardscaler()로 평균이0, 분산1로 데이터 분포도 변환

scaler = StandardScaler() # 객체 생성

data_scaled = scaler.fit_transform(cancer.data) # 객체를 이용해서 fit_transform() 해준다.(정규화 작업)

 

X_train, X_test, y_train, y_test = train_test_split(data_scaled, cancer.target, test_size=0.3, random_state=0)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

In [11]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# DecisionTreeClassifier 를 이용해 학습 및 예측 수행

import warnings

from sklearn.tree import DecisionTreeClassifier

 

df_clf = DecisionTreeClassifier()

df_clf.fit(X_train,y_train)

df_preds = df_clf.predict(X_test)

 

# 모형 성능 평가

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, df_preds)

print('DT 예측치:',accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

DT 예측치: 0.9122807017543859

In [12]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 로지스틱 회귀를 이용해 학습 및 예측 수행

from sklearn.linear_model import LogisticRegression

lr_clf = LogisticRegression(random_state=0)

lr_clf.fit(X_train, y_train)

lr_preds = lr_clf.predict(X_test)

 

# 모형 성능 평가

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, lr_preds)

print('LR 예측치:',accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

LR 예측치: 0.9766081871345029

In [13]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 랜덤 포레스트를 이용해 학습 및 예측 수행

from sklearn.ensemble import RandomForestClassifier

 

rf_clf = RandomForestClassifier(random_state=10)

rf_clf.fit(X_train, y_train)

rf_preds = rf_clf.predict(X_test)

 

# 모형 성능 평가

from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, rf_preds)

print('RF 예측치:',accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

RF 예측치: 0.9649122807017544

교차 검증

KFold : K개의 데이터 폴드를 만들어서 K번 만큼 학습과 검증을 반복 수행(폴드 세트 설정, for 루프 반복 데이터 인덱스 추출, 반복 학습 수행 및 예측 성능 반환)

Stratified KFold : 불균형한 분포도를 가진 레이블 데이터 집합을 위한 방식(KFold 로는 부족한 경우)

K폴드의 경우 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 제대로 분배 못하여 문제가 발생되는데 이 문제를 해결하기 위하여 사용

cross_val_scores : KFold의 일련의 과정을 한꺼번에 수행해주는 API(KFold의 절차가 복잡하기에 이 방법을 적용)

분류 모델의 경우 cvs는 내부적으로 Stratified KFold 방식으로 레이블 값의 분포에 따라 학습/테스트 세트를 분할

K = 5면 5행 5열의 배열을 만든다.( k=3 이면 3행으로 만든다)

첫 번째 폴드에서는 (1,1), 두 번째 폴드에서는 (2,2), (3,3) 이런식으로 계속 해서 성능을 검증해나간다. 이것을 교차검증(cross validation)이라 함

In [14]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import accuracy_score

 

# 독립변수, 종속변수 분리

t_df = pd.read_pickle('t_df.pkl')

 

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

# 학습용 평가용 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

# 분류기 객체 생성

dt_clf = DecisionTreeClassifier(random_state=11)

# rf_clf = RandomForestClassifier(random_state=11)

# lr_clf = LogisticRegression(random_state=11)

 

from sklearn.model_selection import KFold

 

# KFold 교차 검증 수행()

# K개의 데이터 폴드 세트를 만들어서 K번 만큼 각 폴드 세트에

# 학습과 검증 평가를 반복, K가 5이면 5번 평가를 평균한 결과로 예측 성능 검증

# 예측 성능 평가

def exec_kfold(clf, folds=5): # clf는 클래시파이어, folds는 k의 개수

kfold = KFold(n_splits=folds) # n_splits = folds

scores = [] # 만들어서 저장하는 공간( foltset 설정하는 단계 )

 

for iter_count, (train_index, test_index) \

in enumerate(kfold.split(X_df)): # enumerate 해서 독립변수 쪽의 5개를 하나씩 작업해준다.

X_train, X_test = X_df.values[train_index], X_df.values[test_index]

y_train, y_test = y_df.values[train_index], y_df.values[test_index]

 

clf.fit(X_train, y_train) # 반복학습 ( 이 작업들을 각 fold마다 진행 )

predictions = clf.predict(X_test) # 예측값 삽입

accuracy = accuracy_score(y_test, predictions) # 각 폴드마다 한 것을 append 해준다.

scores.append(accuracy) # 5개에 대한 정확도를 출력

print('교차 검증 {0}정확도: {1:.4f}'.format(iter_count, accuracy))

# print('검증 세트 인덱스: {1}'.format(iter_count, test_index))

 

mean_score = np.mean(scores) # mean_score로 평균을 구해준다.(5개 결과를 저장한 scores를 호출하여)

print('평균 정확도: {0: .4f}'.format(mean_score))

 

exec_kfold(dt_clf, folds=5) # 5로 변경하면 5개가 출력된다.

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0정확도: 0.7099 교차 검증 1정확도: 0.7901 교차 검증 2정확도: 0.7252 교차 검증 3정확도: 0.7214 교차 검증 4정확도: 0.7663 평균 정확도: 0.7426

In [15]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# cross_val_scores

# KFold의 일련의 과정을 한꺼번에 수행해주는 API

 

from sklearn.model_selection import cross_val_score

 

scores = cross_val_score(dt_clf, X_df, y_df, cv=10) # cv=5는 교차검증을 얼마나 할 것인가, 숫자를 올리면 KFold와 비슷해진다.

for iter_count, accuracy in enumerate(scores):

print('교차 검증 {0} 정확도: {1:.4f}'.format(iter_count, accuracy))

 

print('평균 정확도:{0:.4f}'.format(np.mean(scores)))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0 정확도: 0.5802 교차 검증 1 정확도: 0.7710 교차 검증 2 정확도: 0.8168 교차 검증 3 정확도: 0.7481 교차 검증 4 정확도: 0.7405 교차 검증 5 정확도: 0.7328 교차 검증 6 정확도: 0.6565 교차 검증 7 정확도: 0.5954 교차 검증 8 정확도: 0.6489 교차 검증 9 정확도: 0.7308 평균 정확도:0.7021

In [16]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

t_df = pd.read_pickle('t_df.pkl')

 

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

# 학습용 평가용 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

# 분류기 객체 생성

dt_clf = DecisionTreeClassifier()

 

# GridSearchCV : 파라미터를 통해 성능을 튜닝. (타이타닉 생존률을 해결하기 위해 필요한 작업)

# 교차 검증을 기반으로 하이퍼 파라미터의 최적 값을 찾게 해줌

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

 

parameters = {'max_depth':[2,3,5,10], 'min_samples_split':[2,3,5], 'min_samples_leaf':[1,5,8]}

# max_depth, min_samples_split, min_samples_leaf 들을 각각 [2,3,5,10], [2,3,5], [1,5,8] 씩 주고 여러번 돌려보게 한다.

 

grid_dclf = GridSearchCV(dt_clf, param_grid=parameters, scoring='accuracy', cv=5, refit=True)

# refit=True는 최적으로 된 하이퍼 파라미터를 반영하겠다는 의미

display(grid_dclf)

grid_dclf.fit(X_train, y_train) # 학습을 시킨다.

 

print('GridSearchCV 최적 하이퍼 파라미터:', grid_dclf.best_params_) # 가장 최적인 경우를 보여준다.

#{'max_depth': 5, 'min_samples_leaf': 5, 'min_samples_split': 2}

print('GridSearchCV 최고 정확도:', grid_dclf.best_score_) # 0.8022738664843928

 

best_dclf = grid_dclf.best_estimator_

display(best_dclf)

dpredictions = best_dclf.predict(X_test)

accuracy = accuracy_score(y_test, dpredictions)

print('Dicision Tree GSCV 예측 정확도 : ', accuracy) # GSCV 예측 정확도 : 0.7824427480916031

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

대표사진 삭제

사진 설명을 입력하세요.

GridSearchCV(cv=5, error_score=nan, estimator=DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best'), iid='deprecated', n_jobs=None, param_grid={'max_depth': [2, 3, 5, 10], 'min_samples_leaf': [1, 5, 8], 'min_samples_split': [2, 3, 5]}, pre_dispatch='2*n_jobs', refit=True, return_train_score=False, scoring='accuracy', verbose=0)

GridSearchCV 최적 하이퍼 파라미터: {'max_depth': 5, 'min_samples_leaf': 5, 'min_samples_split': 2} GridSearchCV 최고 정확도: 0.8022738664843928

DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=5, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=5, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best')

Dicision Tree GSCV 예측 정확도 : 0.7824427480916031

Q. Titanic 생존자 예측 모델 성능을 개선하고자 아래와 같이 교차 검증 및 하이퍼 파라미터 튜닝을 수행하세요.

KFold 교차검증(랜덤포레스트 적용)

cross_val_score를 활용한 교차 검증(랜덤 포레스트 적용)

GridSearchCV를 활용한 교차 검증과 최적 하이퍼파라미터 수행하고 성능을 평가

RandomForestClassifier의 최적 하이퍼 파라미터를 찾고 예측 성능 측정 parameters = {'n_estimators':[50,100,200],'max_depth':[2,3,5],'min_samples_leaf':[1,5,8]}

LogisticRegression의 최적 하이퍼 파라미터를 찾고 예측 성능 측정 parameters = {'penalty':['l2','l1'],'C':[0.01,0.1,1,1,5,10]}

RF 파라미터

n_estimators : (나무의 개수)랜덤 포레스트에서 결정 트리의 개수를 지정. 디폴트는 10개

많이 설정할 수록 좋은 성능을 기대할 수 있지만 학습 수행시간이 오래 걸림

max_features : 결정 트리에 사용된 max_features 파라미터와 같음. sqrt(전체 피처 개수)만큼 참조. 피터가 16개라면 분할 위해 4개 참조

LR 파라미터

- (과재적합을 피하기 위해 회귀계수를 조정해야하는데, 조정하는 방식을 말한다.)

L1 : 불필요한 회귀계수를 급격하게 감소시켜 0으로 만들고 제거

L2 : 회귀 계수의 크기를 감소시킴

C : 규제 강도를 조절하는 alpha 값의 역수. 즉 C값이 작을 수록 규제 강도가 큼

In [17]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import accuracy_score

 

# 독립변수, 종속변수 분리

t_df = pd.read_pickle('t_df.pkl')

 

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

# 학습용 평가용 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

# 분류기 객체 생성

# dt_clf = DecisionTreeClassifier(random_state=11)

rf_clf = RandomForestClassifier(random_state=11)

# lr_clf = LogisticRegression(random_state=11)

 

from sklearn.model_selection import KFold

 

# KFold 교차 검증 수행()

# K개의 데이터 폴드 세트를 만들어서 K번 만큼 각 폴드 세트에

# 학습과 검증 평가를 반복, K가 5이면 5번 평가를 평균한 결과로 예측 성능 검증

# 예측 성능 평가

def exec_kfold(clf, folds=5): # clf는 클래시파이어, folds는 k의 개수

kfold = KFold(n_splits=folds) # n_splits = folds

scores = [] # 만들어서 저장하는 공간( foltset 설정하는 단계 )

 

for iter_count, (train_index, test_index) \

in enumerate(kfold.split(X_df)): # enumerate 해서 독립변수 쪽의 5개를 하나씩 작업해준다.

X_train, X_test = X_df.values[train_index], X_df.values[test_index]

y_train, y_test = y_df.values[train_index], y_df.values[test_index]

 

clf.fit(X_train, y_train) # 반복학습 ( 이 작업들을 각 fold마다 진행 )

predictions = clf.predict(X_test) # 예측값 삽입

accuracy = accuracy_score(y_test, predictions) # 각 폴드마다 한 것을 append 해준다.

scores.append(accuracy) # 5개에 대한 정확도를 출력

print('교차 검증 {0}정확도: {1:.4f}'.format(iter_count, accuracy))

# print('검증 세트 인덱스: {1}'.format(iter_count, test_index))

 

mean_score = np.mean(scores) # mean_score로 평균을 구해준다.(5개 결과를 저장한 scores를 호출하여)

print('평균 정확도: {0: .4f}'.format(mean_score))

 

exec_kfold(rf_clf, folds=5) # 5로 변경하면 5개가 출력된다.

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0정확도: 0.7710 교차 검증 1정확도: 0.8473 교차 검증 2정확도: 0.7405 교차 검증 3정확도: 0.6947 교차 검증 4정확도: 0.7816 평균 정확도: 0.7670

In [18]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# cross_val_scores

# KFold의 일련의 과정을 한꺼번에 수행해주는 API

 

from sklearn.model_selection import cross_val_score

 

scores = cross_val_score(rf_clf, X_df, y_df, cv=10) # cv=5는 교차검증을 얼마나 할 것인가, 숫자를 올리면 KFold와 비슷해진다.

for iter_count, accuracy in enumerate(scores):

print('교차 검증 {0} 정확도: {1:.4f}'.format(iter_count, accuracy))

 

print('평균 정확도:{0:.4f}'.format(np.mean(scores)))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0 정확도: 0.5573 교차 검증 1 정확도: 0.8397 교차 검증 2 정확도: 0.8092 교차 검증 3 정확도: 0.7939 교차 검증 4 정확도: 0.7710 교차 검증 5 정확도: 0.8397 교차 검증 6 정확도: 0.7099 교차 검증 7 정확도: 0.6183 교차 검증 8 정확도: 0.6565 교차 검증 9 정확도: 0.6923 평균 정확도:0.7288

In [19]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

t_df = pd.read_pickle('t_df.pkl')

 

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

# 학습용 평가용 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

# 분류기 객체 생성

dt_clf = DecisionTreeClassifier()

 

# GridSearchCV : 파라미터를 통해 성능을 튜닝. (타이타닉 생존률을 해결하기 위해 필요한 작업)

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

 

parameters = {'n_estimators':[50,100,200],'max_depth':[2,3,5],'min_samples_leaf':[1,5,8]}

 

grid_rflf = GridSearchCV(rf_clf, param_grid=parameters, scoring='accuracy', cv=5, refit=True)

 

display(grid_dclf)

grid_rflf.fit(X_train, y_train)

 

print('GridSearchCV 최적 하이퍼 파라미터:', grid_dclf.best_params_)

 

print('GridSearchCV 최고 정확도:', grid_dclf.best_score_)

 

best_rflf = grid_rflf.best_estimator_

display(best_rflf)

dpredictions = best_rflf.predict(X_test)

accuracy = accuracy_score(y_test, dpredictions)

print('Random Forest GSCV 예측 정확도 : ', accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

대표사진 삭제

사진 설명을 입력하세요.

GridSearchCV(cv=5, error_score=nan, estimator=DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best'), iid='deprecated', n_jobs=None, param_grid={'max_depth': [2, 3, 5, 10], 'min_samples_leaf': [1, 5, 8], 'min_samples_split': [2, 3, 5]}, pre_dispatch='2*n_jobs', refit=True, return_train_score=False, scoring='accuracy', verbose=0)

GridSearchCV 최적 하이퍼 파라미터: {'max_depth': 5, 'min_samples_leaf': 5, 'min_samples_split': 2} GridSearchCV 최고 정확도: 0.8022738664843928

RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=5, max_features='auto', max_leaf_nodes=None, max_samples=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=200, n_jobs=None, oob_score=False, random_state=11, verbose=0, warm_start=False)

Random Forest GSCV 예측 정확도 : 0.7977099236641222

In [20]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import accuracy_score

 

# 독립변수, 종속변수 분리

t_df = pd.read_pickle('t_df.pkl')

 

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

# 학습용 평가용 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

# 분류기 객체 생성

# dt_clf = DecisionTreeClassifier(random_state=11)

# rf_clf = RandomForestClassifier(random_state=11)

lr_clf = LogisticRegression(random_state=11)

 

from sklearn.model_selection import KFold

 

# KFold 교차 검증 수행()

# K개의 데이터 폴드 세트를 만들어서 K번 만큼 각 폴드 세트에

# 학습과 검증 평가를 반복, K가 5이면 5번 평가를 평균한 결과로 예측 성능 검증

# 예측 성능 평가

def exec_kfold(clf, folds=5): # clf는 클래시파이어, folds는 k의 개수

kfold = KFold(n_splits=folds) # n_splits = folds

scores = [] # 만들어서 저장하는 공간( foltset 설정하는 단계 )

 

for iter_count, (train_index, test_index) \

in enumerate(kfold.split(X_df)): # enumerate 해서 독립변수 쪽의 5개를 하나씩 작업해준다.

X_train, X_test = X_df.values[train_index], X_df.values[test_index]

y_train, y_test = y_df.values[train_index], y_df.values[test_index]

 

clf.fit(X_train, y_train) # 반복학습 ( 이 작업들을 각 fold마다 진행 )

predictions = clf.predict(X_test) # 예측값 삽입

accuracy = accuracy_score(y_test, predictions) # 각 폴드마다 한 것을 append 해준다.

scores.append(accuracy) # 5개에 대한 정확도를 출력

print('교차 검증 {0}정확도: {1:.4f}'.format(iter_count, accuracy))

# print('검증 세트 인덱스: {1}'.format(iter_count, test_index))

 

mean_score = np.mean(scores) # mean_score로 평균을 구해준다.(5개 결과를 저장한 scores를 호출하여)

print('평균 정확도: {0: .4f}'.format(mean_score))

 

exec_kfold(lr_clf, folds=5) # 5로 변경하면 5개가 출력된다.

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0정확도: 0.7176 교차 검증 1정확도: 0.8626 교차 검증 2정확도: 0.7672 교차 검증 3정확도: 0.7443 교차 검증 4정확도: 0.7778 평균 정확도: 0.7739

In [21]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# cross_val_scores

# KFold의 일련의 과정을 한꺼번에 수행해주는 API

 

from sklearn.model_selection import cross_val_score

 

scores = cross_val_score(lr_clf, X_df, y_df, cv=10) # cv=5는 교차검증을 얼마나 할 것인가, 숫자를 올리면 KFold와 비슷해진다.

for iter_count, accuracy in enumerate(scores):

print('교차 검증 {0} 정확도: {1:.4f}'.format(iter_count, accuracy))

 

print('평균 정확도:{0:.4f}'.format(np.mean(scores)))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0 정확도: 0.5725 교차 검증 1 정확도: 0.7939 교차 검증 2 정확도: 0.8779 교차 검증 3 정확도: 0.8473 교차 검증 4 정확도: 0.7786 교차 검증 5 정확도: 0.8168 교차 검증 6 정확도: 0.7252 교차 검증 7 정확도: 0.6489 교차 검증 8 정확도: 0.7099 교차 검증 9 정확도: 0.7615 평균 정확도:0.7533

In [22]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

t_df = pd.read_pickle('t_df.pkl')

 

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

# 학습용 평가용 데이터 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

# 분류기 객체 생성

dt_clf = DecisionTreeClassifier()

 

# GridSearchCV : 파라미터를 통해 성능을 튜닝. (타이타닉 생존률을 해결하기 위해 필요한 작업)

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

 

parameters = parameters = {'penalty':['l2','l1'],'C':[0.01,0.1,1,1,5,10]}

 

grid_lrlf = GridSearchCV(lr_clf, param_grid=parameters, scoring='accuracy', cv=5, refit=True)

 

display(grid_lrlf)

grid_lrlf.fit(X_train, y_train)

 

print('GridSearchCV 최적 하이퍼 파라미터:', grid_dclf.best_params_)

 

print('GridSearchCV 최고 정확도:', grid_dclf.best_score_)

 

best_lrlf = grid_lrlf.best_estimator_

display(best_lrlf)

dpredictions = best_lrlf.predict(X_test)

accuracy = accuracy_score(y_test, dpredictions)

print('Logistic Regression GSCV 예측 정확도 : ', accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

대표사진 삭제

사진 설명을 입력하세요.

GridSearchCV(cv=5, error_score=nan, estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, l1_ratio=None, max_iter=100, multi_class='auto', n_jobs=None, penalty='l2', random_state=11, solver='lbfgs', tol=0.0001, verbose=0, warm_start=False), iid='deprecated', n_jobs=None, param_grid={'C': [0.01, 0.1, 1, 1, 5, 10], 'penalty': ['l2', 'l1']}, pre_dispatch='2*n_jobs', refit=True, return_train_score=False, scoring='accuracy', verbose=0)

GridSearchCV 최적 하이퍼 파라미터: {'max_depth': 5, 'min_samples_leaf': 5, 'min_samples_split': 2} GridSearchCV 최고 정확도: 0.8022738664843928

LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, l1_ratio=None, max_iter=100, multi_class='auto', n_jobs=None, penalty='l2', random_state=11, solver='lbfgs', tol=0.0001, verbose=0, warm_start=False)

Logistic Regression GSCV 예측 정확도 : 0.8206106870229007


훈련과정 : R·파이썬 기반 빅데이터 분석 전문가 양성과정

교과목 평가 : 머신러닝 기반 데이터 분석

성명 : 호지수

점수 :

Q. 아래사항을 준수하여 타이타닉 생존자 예측모델을 개발하세요.

데이터 :

제공 데이터 파일 : titanic3.csv

훈련/검증용 데이터 : 평가 데이터 = 8 : 2

훈련/검증용 데이터로 모델 학습 및 검증하고 평가 데이터는 최종 평가에만 사용

모델 개발 방법 :

데이터 전처리 및 탐색적 분석을 통하여 파생변수 최소 2개 이상 개발

알고리즘은 최소한 3개 이상 적용(Decision Tree, Random Forest, Logistic Regression은 필수)

훈련 및 평가 방법 :

GridSearchCV API를 활용하여 교차검증 및 최적 하이퍼파라미터 찾아서 학습 및 검증 수행

In [1]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

import pandas as pd

import numpy as np

 

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import accuracy_score

from sklearn.preprocessing import LabelEncoder

 

# 데이터 호출

t_df = pd.read_csv('../titanic3.csv')

 

# 데이터 전처리

def fillna(df):

df['age'].fillna(df['age'].mean(), inplace=True)

df['cabin'].fillna('N', inplace=True)

df['fare'].fillna(df['fare'].mean(), inplace=True)

df['embarked'].fillna('N', inplace=True)

df['body'].fillna(0, inplace=True) # 0 대신 'N'을 삽입

return df

 

def drop_features(df):

df.drop(['home.dest','boat','name','ticket'], axis=1, inplace=True)

return df

 

def format_features(df):

df['cabin'] = df['cabin'].str[:1]

features = ['cabin','sex','embarked']

for feature in features:

le = LabelEncoder()

df[feature] = le.fit_transform(df[feature])

return df

 

def set_family(df):

df['total_family'] = df['sibsp'] + df['parch'] # total 가족 수 계산

df.drop(['sibsp','parch'], axis=1, inplace=True) # 나뉘어진 가족 열 제외

return df

 

def transform_features(df):

df = fillna(df)

df = drop_features(df)

df = format_features(df)

df = set_family(df)

return df

 

#전처리 메소드 실행

t_df = transform_features(t_df)

display(t_df.head(3))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 3열 선택3열 다음에 열 추가
  • 4열 선택4열 다음에 열 추가
  • 5열 선택5열 다음에 열 추가
  • 6열 선택6열 다음에 열 추가
  • 7열 선택7열 다음에 열 추가
  • 8열 선택8열 다음에 열 추가
  • 9열 선택9열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가

열 너비 조절

행 높이 조절

 

pclass

survived

sex

age

fare

cabin

embarked

body

total_family

0

1

1

0

29.00

211.3375

1

3

0.0

0

1

1

1

1

0.92

151.5500

2

3

0.0

3

2

1

0

0

2.00

151.5500

2

3

0.0

3

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

In [2]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# 변수 분리

y_df = t_df.survived

X_df = t_df.drop('survived', axis=1)

 

#데이터셋 분리

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

#객체 생성

dt_clf = DecisionTreeClassifier(random_state=11)

 

#검증모델 호출

from sklearn.model_selection import KFold

 

# KFold 검증 실행

def exec_kfold(clf, folds=5):

kfold = KFold(n_splits=folds)

scores = []

 

for iter_count, (train_index, test_index) \

in enumerate(kfold.split(X_df)):

X_train, X_test = X_df.values[train_index], X_df.values[test_index]

y_train, y_test = y_df.values[train_index], y_df.values[test_index]

 

clf.fit(X_train, y_train)

predictions = clf.predict(X_test)

accuracy = accuracy_score(y_test, predictions)

scores.append(accuracy)

print('교차 검증 {0}정확도: {1:.4f}'.format(iter_count, accuracy))

 

 

mean_score = np.mean(scores)

print('평균 정확도: {0: .4f}'.format(mean_score))

 

# 메소드 실행(정확도 추출)

exec_kfold(dt_clf, folds=5)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0정확도: 0.7023 교차 검증 1정확도: 0.7634 교차 검증 2정확도: 0.7137 교차 검증 3정확도: 0.7137 교차 검증 4정확도: 0.7471 평균 정확도: 0.7281

In [3]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# cross_val_scores

from sklearn.model_selection import cross_val_score

 

scores = cross_val_score(dt_clf, X_df, y_df, cv=10) # cv=5는 교차검증을 얼마나 할 것인가, 숫자를 올리면 KFold와 비슷해진다.

for iter_count, accuracy in enumerate(scores):

print('DT 교차 검증 {0} 정확도: {1:.4f}'.format(iter_count, accuracy))

 

print('DT 평균 정확도:{0:.4f}'.format(np.mean(scores)))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

DT 교차 검증 0 정확도: 0.6412 DT 교차 검증 1 정확도: 0.7786 DT 교차 검증 2 정확도: 0.8473 DT 교차 검증 3 정확도: 0.7023 DT 교차 검증 4 정확도: 0.7634 DT 교차 검증 5 정확도: 0.7481 DT 교차 검증 6 정확도: 0.6336 DT 교차 검증 7 정확도: 0.6260 DT 교차 검증 8 정확도: 0.6565 DT 교차 검증 9 정확도: 0.7538 DT 평균 정확도:0.7151

In [4]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

 

#파라미터 생성

parameters = {'max_depth':[2,3,5,10], 'min_samples_split':[2,3,5], 'min_samples_leaf':[1,5,8]}

 

#객체 생성

grid_dclf = GridSearchCV(dt_clf, param_grid=parameters, scoring='accuracy', cv=5, refit=True)

 

# 학습

grid_dclf.fit(X_train, y_train)

 

print('GridSearchCV DT 최적 하이퍼 파라미터:', grid_dclf.best_params_)

print('GridSearchCV DT 최고 정확도:', grid_dclf.best_score_)

 

best_dclf = grid_dclf.best_estimator_

display(best_dclf) # 출력

 

# DT 예측 데이터

dpredictions = best_dclf.predict(X_test)

accuracy = accuracy_score(y_test, dpredictions)

print('Dicision Tree GSCV 예측 정확도 : ', accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

GridSearchCV DT 최적 하이퍼 파라미터: {'max_depth': 5, 'min_samples_leaf': 5, 'min_samples_split': 2} GridSearchCV DT 최고 정확도: 0.7946365914786967

DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=5, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=5, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=11, splitter='best')

Dicision Tree GSCV 예측 정확도 : 0.7938931297709924

In [5]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

#Random Forest

rf_clf = RandomForestClassifier(random_state=11)

 

#메소드 실행

exec_kfold(rf_clf, folds=5)

print()

 

# cross_val_scores

from sklearn.model_selection import cross_val_score

 

scores = cross_val_score(rf_clf, X_df, y_df, cv=10)

for iter_count, accuracy in enumerate(scores):

print('RF 교차 검증 {0} 정확도: {1:.4f}'.format(iter_count, accuracy))

 

print('RF 평균 정확도:{0:.4f}'.format(np.mean(scores)))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0정확도: 0.7901 교차 검증 1정확도: 0.8359 교차 검증 2정확도: 0.7405 교차 검증 3정확도: 0.7061 교차 검증 4정확도: 0.7548 평균 정확도: 0.7655 RF 교차 검증 0 정확도: 0.6489 RF 교차 검증 1 정확도: 0.7939 RF 교차 검증 2 정확도: 0.8321 RF 교차 검증 3 정확도: 0.7557 RF 교차 검증 4 정확도: 0.8168 RF 교차 검증 5 정확도: 0.8015 RF 교차 검증 6 정확도: 0.6870 RF 교차 검증 7 정확도: 0.6489 RF 교차 검증 8 정확도: 0.6336 RF 교차 검증 9 정확도: 0.7154 RF 평균 정확도:0.7334

In [17]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

#GridSearchCV

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

 

parameters = {'n_estimators':[50,100,200],'max_depth':[2,3,5],'min_samples_leaf':[1,5,8]}

 

grid_rflf = GridSearchCV(rf_clf, param_grid=parameters, scoring='accuracy', cv=5, refit=True)

 

grid_rflf.fit(X_train, y_train) # 학습

 

print('GridSearchCV RF 최적 하이퍼 파라미터:', grid_rflf.best_params_)

print('GridSearchCV RF 최고 정확도:', grid_rflf.best_score_)

 

best_rflf = grid_rflf.best_estimator_

display(best_rflf)

 

rpredictions = best_rflf.predict(X_test)

accuracy = accuracy_score(y_test, rpredictions)

print('Random Forest GSCV 예측 정확도 : ', accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

GridSearchCV RF 최적 하이퍼 파라미터: {'max_depth': 3, 'min_samples_leaf': 1, 'n_estimators': 200} GridSearchCV RF 최고 정확도: 0.7965686944634314

RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=3, max_features='auto', max_leaf_nodes=None, max_samples=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=200, n_jobs=None, oob_score=False, random_state=11, verbose=0, warm_start=False)

Random Forest GSCV 예측 정확도 : 0.7900763358778626

In [7]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

# Logistic Regression

import warnings

warnings.filterwarnings('ignore')

 

lr_clf = LogisticRegression(random_state=11)

 

exec_kfold(lr_clf, folds=5)

print()

 

# cross_val_scores

from sklearn.model_selection import cross_val_score

 

scores = cross_val_score(lr_clf, X_df, y_df, cv=10)

for iter_count, accuracy in enumerate(scores):

print('LR 교차 검증 {0} 정확도: {1:.4f}'.format(iter_count, accuracy))

 

print('LR 평균 정확도:{0:.4f}'.format(np.mean(scores)))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

교차 검증 0정확도: 0.7710 교차 검증 1정확도: 0.8550 교차 검증 2정확도: 0.7710 교차 검증 3정확도: 0.7634 교차 검증 4정확도: 0.8008 평균 정확도: 0.7922 LR 교차 검증 0 정확도: 0.6260 LR 교차 검증 1 정확도: 0.7939 LR 교차 검증 2 정확도: 0.9084 LR 교차 검증 3 정확도: 0.8550 LR 교차 검증 4 정확도: 0.8015 LR 교차 검증 5 정확도: 0.8244 LR 교차 검증 6 정확도: 0.7557 LR 교차 검증 7 정확도: 0.6794 LR 교차 검증 8 정확도: 0.7634 LR 교차 검증 9 정확도: 0.7692 LR 평균 정확도:0.7777

In [16]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix, f1_score

 

parameters = {'penalty':['l2','l1'],'C':[0.01,0.1,1,1,5,10]}

 

grid_lrlf = GridSearchCV(lr_clf, param_grid=parameters, scoring='accuracy', cv=5, refit=True)

 

grid_lrlf.fit(X_train, y_train) # 학습

 

print('GridSearchCV LR 최적 하이퍼 파라미터:', grid_lrlf.best_params_)

print('GridSearchCV LR 최고 정확도:', grid_lrlf.best_score_)

 

best_lrlf = grid_lrlf.best_estimator_

display(best_lrlf)

 

lpredictions = best_lrlf.predict(X_test)

accuracy = accuracy_score(y_test, lpredictions)

print('Logistic Regression GSCV 예측 정확도 :', accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

GridSearchCV LR 최적 하이퍼 파라미터: {'C': 0.01, 'penalty': 'l2'} GridSearchCV LR 최고 정확도: 0.798459785828207

LogisticRegression(C=0.01, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, l1_ratio=None, max_iter=100, multi_class='auto', n_jobs=None, penalty='l2', random_state=11, solver='lbfgs', tol=0.0001, verbose=0, warm_start=False)

Logistic Regression GSCV 예측 정확도 : 0.8320610687022901

In [18]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.neural_network import MLPClassifier

from sklearn.metrics import classification_report, confusion_matrix

 

X_train, X_test, y_train, y_test = train_test_split(X_df, y_df, test_size=0.2, random_state=11)

 

scaler = StandardScaler()

scaler.fit(X_train)

 

X_train = scaler.transform(X_train)

X_test = scaler.transform(X_test)

 

mlp_clf =MLPClassifier(random_state=10)

 

# MLP알고리즘의 히든레이어 노드를 10개씩 3계층으로 구성

mlp = MLPClassifier(activation='relu',\

alpha=0.0001,\

batch_size='auto',\

beta_1=0.9,\

beta_2=0.999,\

early_stopping=False,\

epsilon=1e-08,\

hidden_layer_sizes=(30, 30, 30),\

learning_rate='constant', \

learning_rate_init=0.001, max_iter=200,\

momentum=0.9, nesterovs_momentum=True,\

power_t=0.5, random_state=None,\

shuffle=True, solver='adam', \

tol=0.0001, validation_fraction=0.1, \

verbose=False, warm_start=False)

 

mlp.fit(X_train, y_train)

 

predictions = mlp.predict(X_test)

 

print(confusion_matrix(y_test, predictions))

print(classification_report(y_test, predictions))

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

[[133 23] [ 32 74]] precision recall f1-score support 0 0.81 0.85 0.83 156 1 0.76 0.70 0.73 106 accuracy 0.79 262 macro avg 0.78 0.78 0.78 262 weighted avg 0.79 0.79 0.79 262

In [21]:

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

열 너비 조절

행 높이 조절

parameters={'alpha': [1,10,0.1],'activation': ["logistic", "relu"]}

 

 

grid_mlplf = GridSearchCV(mlp_clf, param_grid=parameters, n_jobs=-1,verbose=2, scoring='accuracy', cv=5, refit=True)

# refit=True는 최적으로 된 하이퍼 파라미터를 반영하겠다는 의미

 

grid_mlplf.fit(X_train, y_train) # 학습을 시킨다.

 

print('GridSearchCV mlp 최적 하이퍼 파라미터:', grid_mlplf.best_params_)

print('GridSearchCV mlp 최고 정확도:', grid_mlplf.best_score_)

 

best_mlplf = grid_mlplf.best_estimator_

mlppredictions = best_mlplf.predict(X_test)

accuracy = accuracy_score(y_test, mlppredictions)

print('dt 예측 정확도 : ', accuracy)

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Fitting 5 folds for each of 6 candidates, totalling 30 fits

[Parallel(n_jobs=-1)]: Using backend LokyBackend with 4 concurrent workers. [Parallel(n_jobs=-1)]: Done 30 out of 30 | elapsed: 4.6s finished

GridSearchCV mlp 최적 하이퍼 파라미터: {'activation': 'relu', 'alpha': 0.1} GridSearchCV mlp 최고 정확도: 0.8089769879243563 dt 예측 정확도 : 0.7900763358778626

정리

Decision Tree

평균 정확도: 0.7281

교차검증 평균 정확도 : 0.7151

GridSearchCV DT 최적 하이퍼 파라미터: {'max_depth': 5, 'min_samples_leaf': 5, 'min_samples_split': 2}

GridSearchCV DT 최고 정확도: 0.7946365914786967

Dicision Tree GSCV 예측 정확도 : 0.7938931297709924

Random Forest

평균 정확도: 0.7655

교차검증 평균 정확도:0.7334

GridSearchCV RF 최적 하이퍼 파라미터: {'max_depth': 3, 'min_samples_leaf': 1, 'n_estimators': 200}

GridSearchCV RF 최고 정확도: 0.7975210754158123

Random Forest GSCV 예측 정확도 : 0.7900763358778626

Logistic Regression

평균 정확도: 0.7922

교차검증 LR 평균 정확도:0.7777

GridSearchCV LR 최적 하이퍼 파라미터: {'C': 0.01, 'penalty': 'l2'}

GridSearchCV LR 최고 정확도: 0.798459785828207

Logistic Regression GSCV 예측 정확도 : 0.8320610687022901

#### 가장 높은 정확도 : Logistic Regression GSCV 예측 정확도 : 83.2%

 

728x90
반응형

댓글