Не в состоянии изменить гендерные данные на двоичные значения - PullRequest
0 голосов
/ 05 июня 2019

Я работаю на конкурсе Титаник. Это мой код:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

train = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")
test = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")

train['Sex'].replace(['female', 'male'], [0, 1])
train['Embarked'].replace(['C', 'Q', 'S'], [1, 2, 3])

# Fill missing values in Age feature with each sex’s median value of Age
train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)

linReg = LinearRegression()

data = train[['Pclass', 'Sex', 'Parch', 'Fare', 'Age']]

# implement train_test_split
x_train, x_test, y_train, y_test = train_test_split(data, train['Survived'], test_size=0.2, random_state=0)

# Training the machine learning algorithm
linReg.fit(x_train, y_train)

# Checking the accuracy score of the model
accuracy = linReg.score(x_test, y_test)
print(accuracy*100, '%')

Эта строка ранее выглядела так: data = train[['Pclass', 'Parch', 'Fare', 'Age']], что в итоге дало мне показатель точности 19,5%. Я понял, что я не включил секс, поэтому я пошел дальше и сделал это:

data = train[['Pclass', 'Sex', 'Parch', 'Fare', 'Age']]

Затем я получил следующую ошибку:

ValueError: could not convert string to float: 'female'

Здесь я понял, что изменения, которые я внес в мои train['Sex'] и train['Age'], не отразились на обучении и тестировании модели, что, по-видимому, и является причиной того, что моя модель показала 19,5%. Как я сталкиваюсь с этой проблемой?

UPDATE

После первого ответа я попытался изменить эту строку соответственно:

train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)

с:

train['Age'] = train['Age'].fillna(train.groupby('Sex')['Age'].transform("median"), inplace=True)

И тогда я решил напечатать столбец Age, и оказалось, что значения повреждены:

0      None
1      None
2      None
3      None
4      None
5      None
6      None
7      None
8      None
9      None
10     None
11     None
12     None
13     None
14     None
15     None
16     None
17     None
18     None
19     None
20     None
21     None
22     None
23     None
24     None
25     None
26     None
27     None
28     None
29     None
       ... 
861    None
862    None
863    None
864    None
865    None
866    None
867    None
868    None
869    None
870    None
871    None
872    None
873    None
874    None
875    None
876    None
877    None
878    None
879    None
880    None
881    None
882    None
883    None
884    None
885    None
886    None
887    None
888    None
889    None
890    None
Name: Age, Length: 891, dtype: object

Ответы [ 2 ]

4 голосов
/ 05 июня 2019

Это потому, что вы не сохраняете модификации вашего фрейма данных с этой строкой:

train['Sex'].replace(['female', 'male'], [0, 1])

Попробуйте заменить его следующим:

train['sex'] = train['Sex'].replace(['female', 'male'], [0, 1])

То же самое для train['Embarked'].

Обновление

Вам не нужно делать это для train['Age'], fillna уже модифицирует существующий фрейм данных с помощью inplace=true.

0 голосов
/ 05 июня 2019

Вам просто нужно изменить две строки:

train['Sex'].replace(['female', 'male'], [0, 1],inplace = True)
train['Embarked'].replace(['C', 'Q', 'S'], [1, 2, 3],inplace=True)

тогда будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...