해결된 질문
작성
·
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
넵 확인해보았고, 티켓 컬럼은 말씀주신대로 드롭해야되는 이유를 알겠어서 드롭해놓았습니다.
다시 질문드린건, Embarked 컬럼이 왜 드롭되어야 되는지 모르겠어서 다시 드렸습니다.
Embarked 컬럼은 범주형이고, X_train과 X_test의 데이터 수도 동일한데 왜 라벨 인코딩하려고 하면 오류가 뜨는지 이해가 안됩니다.