Проклятие многомерности
: по мере роста количества измерений требуется все больше и больше примеров.

Отображение и визуализация данных разброса
. Для отображения данных нам нужны 2 или 3 измерения данных.

Две основные стратегии снижения измерений

  1. Выбор: выберите лучшие функции и удалите остальные.
  2. Трансформация: создайте новые функции, которые обобщают комбинации исходных функций.

Две стратегии выбора признаков

  1. Фильтрация:оцените важность и оставьте самую важную.
    a. определение порога отклонения
    b. сортировка по коэффициенту корреляции
  2. Оболочка: попробуйте различные комбинации функций, прежде чем выбрать наилучшие результаты
    а. Дальний Восток

Фильтр — пороговое значение отклонения

: Использование «Scikit-learn» «VarianceThreshold ()»

Рабочий процесс для использования следующим образом

  • префит без порога
  • Анализ отклонений
  • Выберите порог
  • Установите выбранный порог
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold()

# prefit object with df[cols] → iris data is stored in DataFrame 'df'
selector.fit(df[cols]) 

# check feature variances
print(selector.variances_)

# choose the threshold
selector.set_params(threshold=0.6)

# refit and transform, store output
out_sel = selector.fit_transform(df[cols])

# check which features are selected
print(selector.get_support())

import pandas as pd

# filter in the selected features
df_cols = df[cols]
df_filter = df_cols.iloc[:, selector.get_support()]

# add labels to new DataFrame and sanity check
df_new = pd.concat([df_filter, df[['species']]], axis=1)
print(df_new.head())

Filter — Коэффициент корреляции

: использование встроенного метода «.corr()» «pandas». Кроме того, мы можем использовать «тепловую карту» Seaborn для визуального анализа сразу многих коэффициентов.

  • abs(значения), близкие к 1, указывают на наибольшую согласованность или наибольшую отрицательную/положительную корреляцию
  • abs(значения), близкие к 0, указывают на самую низкую корреляцию
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
import seaborn as sns

housing = fetch_california_housing()
df = pd.DataFrame(data=housing.data, columns=housing.feature_names) # feature_names : 8 features' names that can affect to define house value
df['MEDV'] = housing.target # add average house value(y) 
df.index.name = 'record'
print(df.head())

# find correlation 
cor = df.corr()
# visualize with seaborn
sns.heatmap(cor, annot=False, cmap=plt.cm.Blues)
plt.show()

Мы можем выбрать порог, проверив коэффициент r с выходной переменной в паре с каждой входной функцией.

selected_cols = cor_target[cor_target > 0.6]
print("selected columns, correltation with target > 0.6")
print(selected_cols)
print()
print(selected_cols.index)
print()
df_sel = df[selected_cols.index]
print(df_sel.head())

Обертка — рекурсивное устранение признаков (RFE)

: Использование встроенного метода scikit-learn под названием «RFE()».

  • два направления; вперед или назад
  • начните с нуля выбранных функций и добавляйте один или несколько в каждой итерации
  • или начните со всех доступных функций и сокращайте их на каждой итерации.
from sklearn.feature_selection import RFE
from sklearn.svm import SVC # standard of predicting score in RFE
import pandas as pd

# load dataset - iris data
df = pd.read_csv('./data/iris.csv') # path can be different with me!
df.index.name = "record"
cols = ['sepal length in cm', 'sepal width in cm', 'petal length in cm', 'petal width in cm']

X = df[cols]
y = df['species']

svc = SVC(kernel='linear', C=1)
rfe = RFE(estimator=svc, n_features_to_select=2, step=1) # in each iteration, delete 1 feature and finally 2 features are kept.
rfe.fit(X, y)

print(cols)
print(rfe.ranking_) # print score that reflects the contribution of each feature to a good prediction

  • n_features_to_select = количество выходных функций
  • шаг = количество функций, которые нужно удалить на каждой итерации (по умолчанию = 1).
  • ranking_ = ранжирование функций → выбранным функциям присваивается ранг 1

Преобразование

: Преобразование означает вращение данных, чтобы они указывали в более полезном направлении. Существует контролируемый или неконтролируемый случай в преобразовании.

  • включает метки данных
  • в то время как без присмотра нет
  1. PCA (анализ основных компонентов) — неконтролируемый
  2. LDA (линейный дискриминантный анализ) — контролируемый

Трансформация — ППШ

: уменьшение размеров данных неконтролируемым образом

Цель метода заключается в следующем:

  • выявление новых векторов признаков
  • максимизация дисперсии данных
    → для максимально возможного сохранения характеристик исходных данных.
  • проецировать исходные данные в новое пространство
import pandas as pd
from sklearn.decomposition import PCA
import seaborn as sns

df = pd.read_csv('./data/iris.csv')
df.index.name = "record"
cols = ['sepal length in cm', 'sepal width in cm', 'petal length in cm', 'petal width in cm']

pca = PCA(n_components=2)

out_pca = pca.fit_transform(df[cols]) # unsupervised - give data only

df_pca = pd.DataFrame(data=out_pca, columns=['pca1', 'pca2'])
df_pca = pd.concat([df_pca, df[['species']]], axis=1)
sns.lmplot(x='pca1', y='pca2', hue='species', data=df_pca, fit_reg=False)

Трансформация — ЛДА

import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import seaborn as sns

df = pd.read_csv('./data/iris.csv')
df.index.name = "record"
cols = ['sepal length in cm', 'sepal width in cm', 'petal length in cm', 'petal width in cm']

lda = LinearDiscriminantAnalysis(n_components=2)

lda.fit(df[cols], df['species']) # Supervised
out_lda = lda.transform(df[cols])

df_lda = pd.DataFrame(data=out_lda, columns=['lda1', 'lda2'])
df_lda = pd.concat([df_lda, df[['species']]], axis=1)
sns.lmplot(x='lda1', y='lda2', hue='species', data=df_lda, fit_reg=False)

n_components

  • если 0 ‹ n_components ‹ 1 → процент
  • если 0 ‹ n_components ‹ 1 → процент

❉ Подгонка против трансформации

Метод «fit ()» предназначен для обучающих данных, подгонки поезда, установленного для масштабирования. Таким образом, можно применить только набор поездов. Набор тестов нельзя использовать для метода fit() или fit_transform(). Из метода fit () мы получаем среднее значение и значение дисперсии. Затем мы можем преобразовать набор поездов, используя приспособленный масштабатор. И мы также можем трансформировать тестовый набор.

подгонка (набор поездов) → подгонка (набор тестов) (X): причина

Рабочий процесс выглядит следующим образом:

  1. Создать масштабатор
  2. подгонка скейлера с помощью набора поездов
  3. трансформировать набор поездов
  4. преобразовать тестовый набор

→ «fit_transform()» может выполнять вторую и третью работу вместе!