Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2017 09:09:00

SergeyChmutov
Зарегистрирован: 2017-08-04
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка данных с помощью pandas

Решаю всеми известную задачку про “Титаник” с kaggle. Подробное описание здесь: https://www.kaggle.com/c/titanic
Решил ее получив результат 0.64 по тестовой выборке и сейчас пытаюсь улучшить этот результат учитывая все больше и больше факторов. Сейчас пытаюсь заполнить пустые значения возраста и для этого учитываю данные из тренировочной выборки и тестовой так же деля ее по группам(мужчины/женщины).

 data_train = pd.read_csv('data/train.csv')
data_test = pd.read_csv('data/test.csv')
# Делаем замену пола: 0 - женский, 1 - мужской
data_train['Sex'] = np.where(data_train['Sex'] == 'female', 0, 1)
data_test['Sex'] = np.where(data_test['Sex'] == 'female', 0, 1)
# Объединяем два dataframe из двух выборок тестовой и тренировочной
# для получения усредненных результатов
data = pd.concat([data_train, data_test], axis=0).groupby('PassengerId').sum()
# Получаем медиану возраста для двух групп пассажиров: мужчины, женщины
median_age_male = data[data.Sex == 1]['Age'].median()
median_age_female = data[data.Sex == 0]['Age'].median()
data_age_new_man = data_train[data_train.Sex == 1][['PassengerId', 'Age']].copy()
data_age_new_woman = data_train[data_train.Sex == 0][['PassengerId', 'Age']].copy()
data_age_new_man['Age'].fillna(median_age_male, inplace=True)
data_age_new_woman['Age'].fillna(median_age_female, inplace=True)
data_age_new = pd.concat([data_age_new_man, data_age_new_woman], axis=0).groupby('PassengerId').sum()
# Получаем тренировочную выборку с непустыми полями возраста
data = pd.concat([data_train, data_age_new], axis=0).groupby('PassengerId').median()

Я реализовал вот таким вот огромным костылем. Подскажите более простой метод. Спасибо.

Офлайн

#2 Ноя. 29, 2017 10:58:15

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Обработка данных с помощью pandas

 >>> data_train = pd.read_csv('train.csv')
>>> data_test = pd.read_csv('test.csv')
>>> data = pd.concat([data_train, data_test], axis=0)
>>> mean_age = data.groupby('Sex')['Age'].mean()
>>> data['Age'].fillna(data['Sex'].map(mean_age), inplace=True)

Отредактировано noob_saibot (Ноя. 29, 2017 11:02:30)

Офлайн

#3 Ноя. 29, 2017 11:40:21

SergeyChmutov
Зарегистрирован: 2017-08-04
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка данных с помощью pandas

noob_saibot
Спасибо, только исправил немного. Все же нам проставить возраст необходимо в тренировочной выборке. И правильнее будет считать медиану, а не среднее значение. А насчет groupby знал же что есть, но как то и не вспомнил про него. Еще раз спасибо.

 data_train = pd.read_csv('data/train.csv')
data_test = pd.read_csv('data/test.csv')
data = pd.concat([data_train, data_test], axis=0)
median_age = data.groupby('Sex')['Age'].median()
data_train['Age'].fillna(data_train['Sex'].map(median_age), inplace=True)

Офлайн

#4 Ноя. 29, 2017 12:34:00

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Обработка данных с помощью pandas

SergeyChmutov
И правильнее будет считать медиану, а не среднее значение
Можно обоснование? Вы проверили распределение на нормальность и обнаружили тяжёлые хвосты? Или из чего исходили?

Офлайн

#5 Ноя. 29, 2017 13:39:40

SergeyChmutov
Зарегистрирован: 2017-08-04
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработка данных с помощью pandas

noob_saibot
Если построить гистограмму возраст/количество, то вид его (на мой взгляд) будет не совсем подходить под нормальное распределение.

Но вот если использовать средне-арифметическое значение, то точность увеличивается.

Отредактировано SergeyChmutov (Ноя. 29, 2017 14:43:23)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version