ValueError: не удалось преобразовать строку в число с плавающей точкой: 'n' - PullRequest
0 голосов
/ 21 сентября 2018

Здравствуйте, я смотрю видео на Udemy.Мы пытаемся применить случайный лесной классификатор.Прежде чем мы сделаем это, мы преобразуем один из столбцов во фрейме данных в строку.Столбец «Кабина» представляет такие значения, как «4C», но чтобы уменьшить количество уникальных значений, мы хотим просто использовать первое число для отображения на новый столбец «Cabin_mapped».

enter image description here

data['Cabin_mapped'] = data['Cabin'].astype(str).str[0]
# this transforms the letters into numbers
cabin_dict = {k:i for i, k in enumerate(
    data['Cabin_mapped'].unique(),0)}

data.loc[:,'Cabin_mapped'] =  data.loc[:,'Cabin_mapped'].map(cabin_dict)

data[['Cabin_mapped', 'Cabin']].head() 

Эта часть ниже просто разбивает данные на обучающие и тестовые наборы.Параметры не имеют большого значения для выяснения проблемы.

X_train_less_cat, X_test_less_cat, y_train, y_test = \
    train_test_split(data[use_cols].fillna(0), data.Survived, 
                     test_size = 0.3, random_state=0) 

Я получаю здесь ошибку после подгонки, говоря, что не могу преобразовать строку в число с плавающей точкой.rf = RandomForestClassifier (n_estimators = 200, random_state = 39) rf.fit (X_train_less_cat, y_train)

Похоже, мне нужно преобразовать один из входных данных обратно в float, чтобы использовать алгоритмы случайных лесов.Это несмотря на то, что в учебном видео ошибка не отображается.Если бы кто-нибудь мог мне помочь, это было бы здорово.

1 Ответ

0 голосов
/ 21 сентября 2018

вот полностью рабочий пример - я выделил бит, который вам не хватает.Вам нужно конвертировать КАЖДЫЙ столбец в число, а не просто «домик».

!wget https://raw.githubusercontent.com/agconti/kaggle-titanic/master/data/train.csv

import pandas as pd

data = pd.read_csv("train.csv")




data['Cabin_mapped'] = data['Cabin'].astype(str).str[0]
# this transforms the letters into numbers
cabin_dict = {k:i for i, k in enumerate(
    data['Cabin_mapped'].unique(),0)}

data.loc[:,'Cabin_mapped'] =  data.loc[:,'Cabin_mapped'].map(cabin_dict)

data[['Cabin_mapped', 'Cabin']].head()


from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split


## YOU ARE MISSING THIS BIT, some of your columns are still strings
## they need to be converted to numbers (ints OR floats)
for n,v in data.items():
    if v.dtype == "object":
        data[n] = v.factorize()[0]
## END of the bit you're missing

use_cols = data.drop("Survived",axis=1).columns

X_train_less_cat, X_test_less_cat, y_train, y_test = \
    train_test_split(data[use_cols].fillna(0), data.Survived, 
                    test_size = 0.3, random_state=0) 


rf = RandomForestClassifier(n_estimators=200, random_state=39)
rf.fit(X_train_less_cat, y_train)
...