ТИТАНИК. ПОСТРОЕНИЕ МОДЕЛИ. Часть 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















Конец