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

Hyoeun Yun님의 프로필 이미지
Hyoeun Yun

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

사이킷런으로 수행하는 타이타닉 생존자 예측 - 02

could not convert string to float 에러..

해결된 질문

작성

·

35K

0

안녕하세요. 사이킷런 알고리즘을 적용하는 단계에서 에러가 나는데 도저히 모르겠습니다.

그리고 궁금한게 titanic_df 를 레이블 인코딩하여 학습/검증 데이터셋으로 분리를 하고나서 X_titanic_df를 확인해보았는데요.

처음에 레이블인코딩했을때는 이렇게 데이터들이 인코딩한 숫자로 나오는데

바로 다음에 위와같이 Null데이터를 처리하고

X_titanic_df 를 확인해보면 레이블인코딩했던게 기존의 문자열로 돌아와있습니다 ㅠㅠ 

원래 이런건가요? 혹시 이것때문에 뒤에서 에러가 나는 것인지..

제가 정말 초보고 거의 이 강의로 코딩세계에 입문한다고 보아도 될 정도라서 에러가 났을 때 알아차리기 힘드네요 ..

답변 5

0

저도 같은 문제가 발생하는데 해결 되셨나요??

 

처음엔 저도 

def format_features(df) :

하단부분에 return df가 for 구문 안쪽에 있어서 인코딩이 초기화 되었나 싶었지만 

for 구문 밖으로 빼놨는데도 인코딩한게 초기화 된 상태 그대로이더라구요..

혹시 잘못된 곳이 있을까요?

0

Hyoeun Yun님의 프로필 이미지
Hyoeun Yun
질문자

와우 감사합니다!

강의 너무 재밌어요 ><

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

Hyoeun Yun님의 프로필 이미지
Hyoeun Yun
질문자

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이 안되서 발생하는 것 같습니다.

캡처해주신 소스코드로만 봐서는 오류가 없어 보입니다.  커널을 재 기동한 후 다시 한번 수행 부탁드리며, 캡처가 아닌 텍스트 형태로 전체 소스 코드를 올려 주십시요. 제가 한번 수행해 보겠습니다.

감사합니다.

Hyoeun Yun님의 프로필 이미지
Hyoeun Yun

작성한 질문수

질문하기