인프런 커뮤니티 질문&답변

김민정님의 프로필 이미지
김민정

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

T2-1. 타이타닉 문제 질문있습니다.

해결된 질문

작성

·

278

·

수정됨

0

저는 지금까지 작업형2 모든 유형의 문제를 object컬럼은 라벨인코딩을 했습니다.

이번에도 라벨인코딩을 하려고 보니 오류가 나서 이전에 질문을 드렸고,

X_train과 X_test의 데이터 수가 달라 있는 오류라고 설명해주셨습니다.

 

그래서 X_train과 X_test의 object 컬럼에 nuniqe, describe, velue_counts등의 함수를 적용하여 확인해보았습니다.

근데 'Embarked'컬럼은 X_train과 X_test내 데이터 종류 수와 종류도 동일한데, 라벨인코딩을 적용하려하니 계속 이런 오류가 뜹니다.

Encoders require their input to be uniformly strings or numbers. Got ['float', 'str']

오류가 뜨는 원인과 왜 'Embarekd'컬럼을 drop했을 때는 모델이 잘 적용되는지가 궁금합니다.

일단 밑에는 제가 'Embakred'컬럼을 drop한 코딩입니다.

 

# EDA
# X_train.info()
# X_test.info()
# drop & pop : PassengerId(pop)
# 추가 삭제 : Cabin, Embarked, Ticket, Name
# 결측치 : Age-수치형(결측값 중간값으로 채움), Cabin!!-범주형(얘는 원래 최빈값으로 채우려다가.. 값이 너무 많아서 삭제함)
# 범주형 : Sex(라벨), Embarked!!(), Ticket!!, Name!!, Cabin!!(얘네 셋은 원래 라벨인코더 하려다가, train과 test의 nunique값이 달라서 삭제함), 
# 수치형 : Pclass, SibSp, Parch, Fare, Age(로버스터스케일러)

# y_train.info() : PassengerId, Survived

X_train = X_train.drop(columns = ['Ticket', 'Name', 'PassengerId', 'Cabin', 'Embarked'])
X_test = X_test.drop(columns = ['Ticket', 'Name', 'Cabin', 'Embarked'])
X_test_id = X_test.pop('PassengerId')
y_train = y_train.drop(columns = ['PassengerId'])

X_train['Age'] = X_train['Age'].fillna(X_train['Age'].mean())
X_test['Age'] = X_test['Age'].fillna(X_test['Age'].mean())

from sklearn.preprocessing import RobustScaler
num = ['Pclass', 'SibSp', 'Parch', 'Fare', 'Age']
scaler = RobustScaler()
X_train[num] = scaler.fit_transform(X_train[num])
X_test[num] = scaler.transform(X_test[num])

from sklearn.preprocessing import LabelEncoder
cols = ['Sex']
encoder = LabelEncoder()
for col in cols :
    X_train[col] = encoder.fit_transform(X_train[col])
    X_test[col] = encoder.transform(X_test[col])

from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, test_size = 0.2, random_state = 2022)

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_tr, np.ravel(y_tr))
pred = model.predict(X_val)

from sklearn.metrics import accuracy_score
accuracy_score(y_val, pred)

pred = model.predict(X_test)
pd.DataFrame({'PassengerId' : X_test_id, 'Survived' : pred}).to_csv('00000.csv', index = False)

pd.read_csv('00000.csv')

X_train.shape, X_test.shape, y_train.shape

답변 1

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

이 글의 마지막 답변을 확인해보셨을까요?

문제는 티켓 컬럼이고 티켓컬럼에 대한 처리 방법 안내드렸습니다.

https://www.inflearn.com/questions/1087139/%EC%BA%90%EA%B8%80%EC%97%90-%EC%9E%88%EB%8A%94-%ED%83%80%EC%9D%B4%ED%83%80%EB%8B%89-%EC%83%9D%EC%A1%B4%EB%A5%A0-%EB%AC%B8%EC%A0%9C?re_comment_id=299000

김민정님의 프로필 이미지
김민정
질문자

넵 확인해보았고, 티켓 컬럼은 말씀주신대로 드롭해야되는 이유를 알겠어서 드롭해놓았습니다.

다시 질문드린건, Embarked 컬럼이 왜 드롭되어야 되는지 모르겠어서 다시 드렸습니다.

Embarked 컬럼은 범주형이고, X_train과 X_test의 데이터 수도 동일한데 왜 라벨 인코딩하려고 하면 오류가 뜨는지 이해가 안됩니다.

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

원인을 찾았습니다.

print(X_train['Embarked'].isnull().sum())

print(X_test['Embarked'].isnull().sum())

X_train['Embarked'] = X_train['Embarked'].fillna('S')

X_test['Embarked'] = X_test['Embarked'].fillna('S')

 

결측치가 숨어있었네요 🙂

김민정님의 프로필 이미지
김민정
질문자

꼼꼼하게 본다고 봤는데.. 결측치가 있었군요.. ㅠㅠ

그래도 데이터 수 가 다를 때는 drop해줘야된다는 개념이 잡혔습니다. 감사합니다 선생님!

김민정님의 프로필 이미지
김민정

작성한 질문수

질문하기