해결된 질문
작성
·
35K
0
안녕하세요. 사이킷런 알고리즘을 적용하는 단계에서 에러가 나는데 도저히 모르겠습니다.
그리고 궁금한게 titanic_df 를 레이블 인코딩하여 학습/검증 데이터셋으로 분리를 하고나서 X_titanic_df를 확인해보았는데요.
처음에 레이블인코딩했을때는 이렇게 데이터들이 인코딩한 숫자로 나오는데
바로 다음에 위와같이 Null데이터를 처리하고
X_titanic_df 를 확인해보면 레이블인코딩했던게 기존의 문자열로 돌아와있습니다 ㅠㅠ
원래 이런건가요? 혹시 이것때문에 뒤에서 에러가 나는 것인지..
제가 정말 초보고 거의 이 강의로 코딩세계에 입문한다고 보아도 될 정도라서 에러가 났을 때 알아차리기 힘드네요 ..
답변 5
0
저도 같은 문제가 발생하는데 해결 되셨나요??
처음엔 저도
def format_features(df) :
하단부분에 return df가 for 구문 안쪽에 있어서 인코딩이 초기화 되었나 싶었지만
for 구문 밖으로 빼놨는데도 인코딩한게 초기화 된 상태 그대로이더라구요..
혹시 잘못된 곳이 있을까요?
0
0
format_features()의 return 절이 잘못되어 있군요. 아래와 같이 return 절의 들여쓰기를 for 문 바깥으로 해주십시요.
def format_features(df):
df['Cabin'] = df['Cabin'].str[:1]
features = ['Cabin', 'Sex', 'Embarked']
for feature in features :
le = LabelEncoder()
le = le.fit(df[feature])
df[feature] = le.transform(df[feature])
# for 문 바깥에서 return 수행.
return df
0
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
titanic_df = pd.read_csv('./titanic_train.csv')
titanic_df.head(3)
print('\n ### train데이터정보 ###\n')
print(titanic_df.info())
titanic_df['Age'].fillna(titanic_df['Age'].mean(), inplace=True) #inplace=True는 기존데이터를 업데이트한다는말
titanic_df['Cabin'].fillna('N', inplace=True) #다른 카테고리성 컬럼인 'N'으로 업데이트
titanic_df['Embarked'].fillna('N', inplace=True)
print(titanic_df.isnull()) #null데이터를 True로 표시
print('\n데이터세트 컬럼별Null 개수', titanic_df.isnull().sum()) #True값의 합을 컬럼별로 표시
print('\n데이터세트 전체 Null개수', titanic_df.isnull().sum().sum())
print('Sex값 분포: \n', titanic_df['Sex'].value_counts()) #데이터프레임의 컬럼의 데이터가 카테고리성일때 카테고리별 개수
print('Cabin값 분포: \n', titanic_df['Cabin'].value_counts())
print('Embarked값 분포: \n', titanic_df['Embarked'].value_counts())
titanic_df['Cabin'] = titanic_df['Cabin'].str[:1]
#데이터프레임에서 []은 필터링을 한다는 의미니, Cabin컬럼의 데이터에 어떤것에 필터링을 하는지 써야함. 그게 .string
print(titanic_df['Cabin'].head(3))
titanic_df['Cabin'].value_counts()
titanic_df.groupby(['Sex', 'Survived'])['Survived'].count()
sns.barplot(x='Sex', y='Survived', data=titanic_df)
sns.barplot(x='Pclass', y='Survived', hue='Sex', data=titanic_df)
# 나이대별로 카테고리구분하는 함수생성, df의 apply lambda식에 사용
def get_category(age):
cat = ''
if age<= -1: cat = 'Unknown'
elif age<=5: cat = 'Baby'
elif age<=12: cat = 'Child'
elif age<=18: cat = 'Teenager'
elif age<=25: cat = 'Student'
elif age<=35: cat = 'Young Adult'
elif age<=60: cat = 'Adult'
else : cat = 'Elderly'
return cat
#막대그래프의 크기 figure를 더 크게 설정
plt.figure(figsize=(10,6))
#x축 값을 나이대별로 순차적으로 표시
group_names = ['Unknown', 'Baby', 'Child', 'Teenager', 'Student', 'Young Adult', 'Adult', 'Elderly']
#lambda식에 위에서 생성한 get_category()함수를 반환 (람다식에 입력인자를 넣어 계산한 값이 반환됨)
titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x : get_category(x))
sns.barplot(x='Age_cat', y='Survived', hue='Sex', data=titanic_df, order=group_names)
titanic_df.drop('Age_cat', axis=1, inplace=True) #Age_cat 컬럼을 드롭 (그래프만 보고, 컬럼 없애는것임.)
from sklearn import preprocessing
def encode_features(dataDF):
features = ['Cabin', 'Sex', 'Embarked']
for feature in features:
le = preprocessing.LabelEncoder()
le = le.fit(dataDF[feature])
dataDF[feature] = le.transform(dataDF[feature])
return dataDF
titanic_df = encode_features(titanic_df)
titanic_df.head()
from sklearn.preprocessing import LabelEncoder
def fillna(df):
df['Age'].fillna(df['Age'].mean(), inplace=True)
df['Cabin'].fillna('N', inplace=True)
df['Embarked'].fillna('N', inplace=True)
df['Fare'].fillna(0, inplace=True)
return df
def drop_features(df):
df.drop(['PassengerId', '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()
le = le.fit(df[feature])
df[feature] = le.transform(df[feature])
return df
def transform_features(df):
df = fillna(df)
df = drop_features(df)
df = format_features(df)
return df
# 원본 데이터를 재로딩 하고, feature데이터 셋과 Label 데이터 셋 추출.
titanic_df = pd.read_csv('./titanic_train.csv')
y_titanic_df = titanic_df['Survived']
X_titanic_df= titanic_df.drop('Survived',axis=1)
X_titanic_df = transform_features(X_titanic_df)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df,
test_size=0.2, random_state=11)
X_titanic_df
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
#3개의 알고리즘을 위한 사이킷런의 클래스 생성
dt_clf = DecisionTreeClassifier(random_state=11)
rf_clf = RandomForestClassifier(random_state=11)
lr_clf = LogisticRegression()
# DecisionTreeClassifier 학습/예측/평가
dt_clf.fit(X_train, y_train)
dt_pred = dt_clf.predict(X_test)
print('DecisionTreeClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))
# RandomForestClassifier 학습/예측/평가
rf_clf.fit(X_train, y_train)
rf_pred = rf_clf.predict(X_test)
print('RandomForestClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, rf_pred)))
# LogisticRegression 학습/예측/평가
lr_clf.fit(X_train, y_train)
lr_pred = lr_clf.predict(X_test)
print('LogisticRegression 정확도: {0:.4f}'.format(accuracy_score(y_test, lr_pred)))
0
안녕하십니까,
오류는 뒤에서 말씀하신 string값이 label encoding이 안되서 발생하는 것 같습니다.
캡처해주신 소스코드로만 봐서는 오류가 없어 보입니다. 커널을 재 기동한 후 다시 한번 수행 부탁드리며, 캡처가 아닌 텍스트 형태로 전체 소스 코드를 올려 주십시요. 제가 한번 수행해 보겠습니다.
감사합니다.