타이타닉 데이터를 통해 사이킷런, 판다스로 one-hot-encoding 하기
소스코드 : https://github.com/corazzon/KaggleStruggle/blob/master/titanic/one-hot-encoding.ipynb
타이타닉 데이터 다운로드 : https://www.kaggle.com/c/titanic/data
범주형 데이터 다루기 - 원핫인코딩
(One Hot Encoding)
데이터에는 수치형 데이터와 텍스트 데이터나 범주형 데이터가 있다. 머신러닝이나 딥러닝 알고리즘은 수치로 된 데이터만 이해할 수 있다. 그래서 기계가 이해할 수 있는 형태로 데이터를 변환해 주어야 하는데 범주형 데이터는 원핫인코딩 형태로 변환해 준다. 원핫인코딩이란 해당되는 하나의 데이터만 1로 변경해 주고 나머지는 0으로 채워주는 것을 뜻한다.
사이킷런의 LabelEncoder로 원핫인코딩해준다.
# 카테고리 데이터를 인코딩 해준다.
from sklearn.preprocessing import LabelEncoder
# 성별을 0과 1로 인코딩
def gender_to_int(data):
le = LabelEncoder()
le.fit(["male","female"])
data["Sex"] = le.transform(data["Sex"])
return data
train_c_df = gender_to_int(train_c_df)
test_c_df = gender_to_int(test_c_df)
train_c_df.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | 1 | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | 0 | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | 0 | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | 0 | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | 1 | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
승선위치
train['Embarked'].value_counts()
S 644
C 168
Q 77
Name: Embarked, dtype: int64
train_c_df["Embarked_C"] = train_c_df["Embarked"] == "C"
train_c_df["Embarked_S"] = train_c_df["Embarked"] == "S"
train_c_df["Embarked_Q"] = train_c_df["Embarked"] == "Q"
print(train.shape)
print(train_c_df.shape)
train_c_df[["Embarked", "Embarked_C", "Embarked_S", "Embarked_Q"]].head(10)
(891, 12)
(891, 15)
Embarked | Embarked_C | Embarked_S | Embarked_Q | |
---|---|---|---|---|
0 | S | False | True | False |
1 | C | True | False | False |
2 | S | False | True | False |
3 | S | False | True | False |
4 | S | False | True | False |
5 | Q | False | False | True |
6 | S | False | True | False |
7 | S | False | True | False |
8 | S | False | True | False |
9 | C | True | False | False |
판다스의 get_dummies로 원핫인코딩
# 기계가 데이터를 이해할 수 있도록
# 카테고리 데이터를 one-hot-encoding 해준다.
def dummy_data(data, columns):
for column in columns:
data = pd.concat([data, pd.get_dummies(data[column], prefix = column)], axis=1)
data = data.drop(column, axis=1)
return data
dummy_columns = ["Sex", "Pclass", "Embarked"]
train_dummy = dummy_data(train, dummy_columns)
test_dummy = dummy_data(test, dummy_columns)
print('원핫인코딩 전 shape')
print(train.shape)
print(test.shape)
print('get_dummies로 원핫인코딩 후 shape')
print(train_dummy.shape)
print(test_dummy.shape)
원핫인코딩 전 shape
(891, 12)
(418, 11)
get_dummies로 원핫인코딩 후 shape
(891, 17)
(418, 16)
train_dummy.head()
PassengerId | Survived | Name | Age | SibSp | Parch | Ticket | Fare | Cabin | Sex_0 | Sex_1 | Pclass_1 | Pclass_2 | Pclass_3 | Embarked_C | Embarked_Q | Embarked_S | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | Braund, Mr. Owen Harris | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
1 | 2 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
2 | 3 | 1 | Heikkinen, Miss. Laina | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
3 | 4 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
4 | 5 | 0 | Allen, Mr. William Henry | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
- 이렇게 인코딩 된 데이터를 그대로 사용하게 된다면 사용하지 않는 컬럼을 drop 해주는 방법으로 피처를 생성해 준다.
# 사용하지 않을 컬럼을 제거해 피처로 사용할 컬럼만 남겨둔다.
def drop_not_concerned(data, columns):
return data.drop(columns, axis=1)
not_concerned_columns = ["PassengerId", "Name", "Ticket", "Cabin"]
X_train = drop_not_concerned(train_dummy, not_concerned_columns)
X_train = X_train.drop('Survived', axis=1)
X_test = drop_not_concerned(test_dummy, not_concerned_columns)
X_train.head()
Age | SibSp | Parch | Fare | Sex_0 | Sex_1 | Pclass_1 | Pclass_2 | Pclass_3 | Embarked_C | Embarked_Q | Embarked_S | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 22.0 | 1 | 0 | 7.2500 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
1 | 38.0 | 1 | 0 | 71.2833 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
2 | 26.0 | 0 | 0 | 7.9250 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
3 | 35.0 | 1 | 0 | 53.1000 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
4 | 35.0 | 0 | 0 | 8.0500 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
등록된 질문이 없습니다. 궁금한 부분이 있으면 주저하지 말고 무엇이든 물어보세요.