탐색적데이터분석(EDA) / 텍스트 데이터 다루기
SibSp, Parch 컬럼을 통합하여 가족(Family)라는 새로운 컬럼을 생성
pd.set_option('display.max_rows',10)
#SibSp + Parch
# train['넣어주고싶은 컬럼이름']
train['Family_Size']=train['SibSp'] + train['Parch'] + 1
test['Family_Size']=test['SibSp'] + test['Parch'] + 1
sns.countplot(data = train,
x = 'Family_Size',
hue = 'Survived');
# 1명일때는 0 > 1/ 2 ~ 4 : 0 < 1 / 5 ~ 6 : 0 > 1
#✔✔✔✔✔✔✔
#범주형 => 수치형 : 원핫인코딩(우선순위 X), 레이블인코딩 (우선순위 O)
#수치형 => 범주형 : binning
#binning : 범주의 크기를 줄여주는 작업진행 => 사소한 관찰오류를 줄여주기 위해
# Cut 함수를 사용하여 카테고리화 진행
# 가족의 사이즈가 1이면 'Alone', '2~4' : 'Small' , '5~' : 'Large'
# 구간설정
b = [0,1,4,11]# 앞에있는 숫자는 불포함 , 뒤에있는 숫자는 포함
# 각 구간의 이름을 지정
l = ['Alone','Small','Large']
# 카테고리화
train['Family_Size']=pd.cut(train['Family_Size'], bins = b, labels=l)#bins = 어떤구간, l = 라벨구간
test['Family_Size']=pd.cut(test['Family_Size'], bins = b, labels=l)
# 그룹화된 Family_Size 시각화
sns.countplot(data = train,
x = 'Family_Size',
hue = 'Survived');
=====================================
텍스트 데이터 다루기(Name 컬럼 활용)
train['Name']
# 성, 호칭, 이름
# Mr, Mrs, Miss, Dr, Master
# 호칭만 인덱싱
# split() : 특정 문자열을 기준으로 데이터를 잘라주는 기능
# 쉼표를 기준으로 데이터 나누기
train['Name'][1].split(',')[1]
# 다시한번 . 을 기준으로 나눠주기
train['Name'][1].split(',')[1].split('.')[0]
# strip() : 공백을 지워주는 기능
train['Name'][1].split(',')[1].split('.')[0].strip()
# 'Name' 컬럼의 모든 데이터에 적용(apply)
def split_name (data) :
return data.split(',')[1].split('.')[0].strip()
# 'Title' 이라는 컬럼을 생성해서 데이터 대입해주기
train['Title'] = train['Name'].apply(split_name)
test['Title'] = test['Name'].apply(split_name)
def split_name (data) :
return data['Name'].split(',')[1].split('.')[0].strip()
train['Title'] = train.apply(split_name, axis=1)
test['Title'] = test.apply(split_name, axis=1)
test['Title'].unique()
plt.figure(figsize=(15,5))
plt.ylim(0,10) # y축 범위 제한
sns.countplot(data = train,
x = 'Title',
hue = 'Survived');
# Rev : 목사
# 개수가 많이 있는 데이터는 남겨두고 소수의 데이터들은 그룹을 묶는다.
train['Title'].unique()
# 임의의 자리를 바꿔 리스트화
# => zip 함수 사용시 데이터의 순서가 의미가 있기 때문
title=['Mr', 'Mrs', 'Miss', 'Master', 'Rev','Don', 'Dr', 'Mme', 'Ms',
'Major', 'Lady', 'Sir', 'Mlle', 'Col', 'Capt', 'the Countess',
'Jonkheer']
# 중요호칭(5개)을 제외한 것들은 other로 변환하여 list에 저장
# 임의의값만들기
convert_title=['Mr', 'Mrs', 'Miss', 'Master', 'Rev']+['Other']*12
convert_title
# zip이라는 함수를 사용하여 리스트 형태인 title 과 convert_title을 차례로 연결
# 두 그룹의 데이터를 엮어준다 zip(title, convert_title) 합치기
# 같은 사이즈여야한다.
title_dict = dict(zip(title,convert_title))
# title_dict 을 통해서 실제 Title 컬럼의 데이터를 변경 => .map(dict)
train['Title']=train['Title'].map(title_dict)
#키값에 해당하는 밸류로 값을 변경해주는 함수
# 실제로 바뀌었는지 확인
train['Title'].unique()
# train과 test를 비교해서 일치하지않는 값이있어서 직접 값을 넣어준다
title_dict['Dona'] = 'Other'
title_dict
test[test['Title']=='Dona']
# test['Title'] 값 변경
test['Title']=test['Title'].map(title_dict)
test['Title'].unique()
=============================
정리가끝났으면 필요없는 컬럼 삭제
Name ,SibSp, Parch, Ticket
# train 데이터 컬럼 삭제
train.drop(['Name','SibSp','Parch','Ticket'], axis=1,inplace=True)
# test 데이터 컬럼 삭제
test.drop(['Name','SibSp','Parch','Ticket'], axis=1,inplace=True)
# 크기확인
print('훈련용 데이터 : ', train.shape) # 문제데이터 + 정답 데이터
print('테스트용 데이터 : ', test.shape)# 문제데이터 + 정답 데이터는 kaggle이 가지고있음
모델링 (분리, 모델 선택, 모델학습 , 모델평가)
#변수명 X_train,y_train,X_test 데이터 분리
#X_train = train.loc[:,'Pclass':]
#y_train = train.loc[:,'Survived']
X_train = train.iloc[:,1:]
y_train = train['Survived']
X_test = test
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
# 범주형() 문자열 데이터 인코딩해주기
# 원핫인코딩
X_train=pd.get_dummies(X_train)
X_test=pd.get_dummies(X_test)
# 원핫인코딩 후에 X_train과 X_test의 컬럼개수 차이가 남 (기계학습시 오류의 원인)
# 순서와 개수를 완전 동일하게 맞춰줘야 원활한 기계학습이 가능
#set() : 중복이 없는 요소들 한 값들로 구성됨
set(X_train.columns)-set(X_test.columns)
# 'Deck_T' 컴럼의 값을 가지는 승객 출력(불리언인덱싱)
X_train[X_train['Deck_T']==1]
# 기계학습을 위해서 X_test 에도 Deck_T 라는 컬럼추가해주기
# 데이터값은 전부 0을 채워주면 된다.(없는 것으로 인식)
X_test['Deck_T']=0
# 순서까지 맞춰주기
X_train.columns
X_test.columns
# 기계학습을위해 컬럼의 순서를 맞춰준다
# Deck_T 컬럼을 임시변수에 저장
temp = X_train['Deck_T']
# 원래있던 train의 Deck_T삭제
X_train.drop('Deck_T',axis=1,inplace=True)
# 임시변수에 들어있는 Deck_T값을 train에다가 병합
X_train=pd.concat([X_train,temp],axis=1)
X_train.head()
모델 선택 및 학습
배운모델 2가지
knn 모델 (최근접이웃모델)
의사결정나무 모델
# 모델 불러오기
from sklearn.neighbors import KNeighborsClassifier as knc
from sklearn.tree import DecisionTreeClassifier as dtc
# 교차검증
from sklearn.model_selection import cross_val_score
# 트리모델 1
# 트리 객체 생성(하이퍼파라미터 조절 X)
tree_model=dtc()
# 학습전 교차검증 진행
result = cross_val_score(tree_model,X_train,y_train,cv=20)
result
result.mean()
# 모델 학습
tree_model.fit(X_train,y_train)
# 모델 평가
pre=tree_model.predict(X_test)
pre
# 우리가 예측한 데이터를 kaggle에 제출
result_submission=pd.read_csv('data/gender_submission.csv')
result_submission
# Survived 컬럼에 우리가 예측한 pre 답을 대입
result_submission['Survived'] = pre
result_submission
# csv 파일로 저장
result_submission.to_csv("JYP.csv", index = False)