ТИТАНИК. ПОСТРОЕНИЕ МОДЕЛИ. Часть 2.
=====================================
PREPROCESSING. НОРМАЛИЗАЦИЯ ДАННЫХ.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Это формула нормализации. Рекомендую самостоятельно
найти, осознать и научиться её вручную использовать.
РАБОТА В POSTGRESQL
-------------------
Если вы имеете админские права postgres
---------------------------------------
Войти в postgres, как админ
psql
Пересоздать базу titanic
drop database if exists titanic;
create database titanic;
Выйти и= Postgres`а
\q
Скачать на свой комп свежий дамп базы
Распаковать и залить дамп в базу
wget http://an2k.ru/data/level2/204-titanic/titanic203.dump.bz2
bzip2 -d titanic203.dump.bz2
psql titanic < titanic203.dump
Войти в базу как админ
psql titanic
Посмотреть список таблиц
\dt
Если таблицы есть - продолжить работу с базой,
предварительно переподключившись, как pupkin.
Если у вас нет прав админа postgres
-----------------------------------
Вы должны подключиться к базе, возможно по сети,
примерно так:
psql -h 127.0.0.1 -U pupkin titanic
Создать таблицу содержащую
только отобранные признаки
и
Создать таблицу содержащую
признак выживания
create table tit3 as
select id, age, pclass, sex, sibsp,
parch, fare, embarked
from tit2 ;
create table tit3_alive as
select id, survived from tit2 ;
Проверить что получилось
select * from tit3 limit 2;
-[ RECORD 1 ]------
id | 1
age | 29
pclass | 1
sex | female
sibsp | 0
parch | 0
fare | 211.3375
embarked | S
-[ RECORD 2 ]------
id | 2
age | 0.9167
pclass | 1
sex | male
sibsp | 1
parch | 2
fare | 151.55
embarked | S
select * from tit3_alive limit 3;
id | survived
----+----------
1 | 1
2 | 1
3 | 0
Создать таблицу для хранения
нормализованных данных
CREATE TABLE tit3_norm (
id INTEGER PRIMARY KEY,
age_norm NUMERIC,
pclass_norm NUMERIC,
sex TEXT,
sibsp_norm NUMERIC,
parch_norm NUMERIC,
fare_norm NUMERIC,
embarked TEXT
);
-- Создать функцию для нормализации данных
-- помог ИИ: https://www.phind.com/search/cmg38wm4000002v6rdwwfnbpq
CREATE OR REPLACE FUNCTION f_normalize_tit3()
RETURNS VOID AS $$
DECLARE
mean_age NUMERIC;
std_age NUMERIC;
mean_pclass NUMERIC;
std_pclass NUMERIC;
mean_sibsp NUMERIC;
std_sibsp NUMERIC;
mean_parch NUMERIC;
std_parch NUMERIC;
mean_fare NUMERIC;
std_fare NUMERIC;
BEGIN
-- Расчет статистик для числовых столбцов
SELECT AVG(age), STDDEV(age)
INTO mean_age, std_age
FROM tit3 WHERE age IS NOT NULL;
SELECT AVG(pclass), STDDEV(pclass)
INTO mean_pclass, std_pclass
FROM tit3 WHERE pclass IS NOT NULL;
SELECT AVG(sibsp), STDDEV(sibsp)
INTO mean_sibsp, std_sibsp
FROM tit3 WHERE sibsp IS NOT NULL;
SELECT AVG(parch), STDDEV(parch)
INTO mean_parch, std_parch
FROM tit3 WHERE parch IS NOT NULL;
SELECT AVG(fare), STDDEV(fare)
INTO mean_fare, std_fare
FROM tit3 WHERE fare IS NOT NULL;
-- Вставка нормализованных данных
INSERT INTO tit3_norm (
id, age_norm, pclass_norm, sex, sibsp_norm,
parch_norm, fare_norm, embarked
)
SELECT
id,
CASE WHEN age IS NOT NULL THEN
(age - mean_age) / std_age END,
CASE WHEN pclass IS NOT NULL THEN
(pclass - mean_pclass) / std_pclass END,
sex,
CASE WHEN sibsp IS NOT NULL THEN
(sibsp - mean_sibsp) / std_sibsp END,
CASE WHEN parch IS NOT NULL THEN
(parch - mean_parch) / std_parch END,
CASE WHEN fare IS NOT NULL THEN
(fare - mean_fare) / std_fare END,
embarked
FROM tit3;
END;
$$ LANGUAGE plpgsql;
Посмотреть код функции
\sf f_normalize_tit3
Выполнить нормализацию с помощью ф-ции
SELECT f_normalize_tit3();
В итоге:
- числовые столбцы приводятся к единой шкале (-2 до +2);
- поля sex и embarked содержат категориальные данные
(мужчина/женщина, порт отправления), нормализация этих столбцов
не имеет смысла, так как они не имеют количественного измерения.
Проверить результат
select * from tit3_norm limit 2;
titanic-# ;
-[ RECORD 1 ]------------------------
id | 1
age_norm | -0.0328567272818018
pclass_norm | -1.54550718718313352378
sex | female
sibsp_norm | -0.47890372850921475001
parch_norm | -0.44482949244919999959
fare_norm | 3.4412248413693
embarked | S
-[ RECORD 2 ]------------------------
id | 2
age_norm | -2.1662345045659
pclass_norm | -1.54550718718313352378
sex | male
sibsp_norm | 0.48110389877801665544
parch_norm | 1.86581259332858888720
fare_norm | 2.28576757835192
embarked | S
Конец