10.1. Progowanie wariancji cechy liczbowej

# Wczytanie bibliotek.
from sklearn import datasets
from sklearn.feature_selection import VarianceThreshold

# Wczytanie pewnego zbioru danych.
iris = datasets.load_iris()

# Utworzenie cech i zdefiniowanie celu.
features = iris.data
target = iris.target

# Zdefiniowanie wartości progowej.
thresholder = VarianceThreshold(threshold=.5)

# Utworzenie macierzy cech o wysokiej wariancji.
features_high_variance = thresholder.fit_transform(features)

# Wyświetlenie macierzy cech o wysokiej wariancji.
features_high_variance[0:3]

array([[ 5.1,  1.4,  0.2],
       [ 4.9,  1.4,  0.2],
       [ 4.7,  1.3,  0.2]])





# Wyświetlenie wariancji.
thresholder.fit(features).variances_

array([0.68112222, 0.18871289,  3.09550267,  0.57713289])





# Wczytanie biblioteki.
from sklearn.preprocessing import StandardScaler

# Standaryzacja macierzy cech.
scaler = StandardScaler()
features_std = scaler.fit_transform(features)

# Obliczenie wariancji poszczególnych cech.
selector = VarianceThreshold()
selector.fit(features_std).variances_

array([ 1.,  1.,  1.,  1.])






10.2. Progowanie wariancji cechy binarnej

# Wczytanie biblioteki.
from sklearn.feature_selection import VarianceThreshold

# Utworzenie macierzy cech o następujących właściwościach:
# Cecha 0: 80% klasy 0.
# Cecha 1: 80% klasy 1.
# Cecha 2: 60% klasy 0, 40% klasy 1.
features = [[0, 1, 0],
            [0, 1, 1],
            [0, 1, 0],
            [0, 1, 1],
            [1, 0, 0]]

# Progowanie według wariancji.
thresholder = VarianceThreshold(threshold=(.75 * (1 - .75)))
thresholder.fit_transform(features)

array([[0],
       [1],
       [0],
       [1],
       [0]])





10.3. Obsługa wysoce skorelowanych cech

# Wczytanie bibliotek.
import pandas as pd
import numpy as np

# Utworzenie macierzy cech z dwiema wysoce skorelowanymi cechami.
features = np.array([[1, 1, 1],
                     [2, 2, 0],
                     [3, 3, 1],
                     [4, 4, 0],
                     [5, 5, 1],
                     [6, 6, 0],
                     [7, 7, 1],
                     [8, 7, 0],
                     [9, 7, 1]])

# Konwersja macierzy cech na obiekt typu DataFrame.
dataframe = pd.DataFrame(features)

# Utworzenie macierzy korelacji.
corr_matrix = dataframe.corr().abs()

# Wybór górnego trójkąta macierzy korelacji.
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape),
                          k=1).astype(np.bool))

# Wyszukanie indeksu kolumn cech o korelacji większej niż 0,95.
to_drop = [column for column in upper.columns if any(upper[column] > 0.95)]

# Usunięcie cech.
dataframe.drop(dataframe.columns[to_drop], axis=1).head(3)





# Macierz korelacji.
dataframe.corr()





# Górny trójkąt macierzy korelacji.
upper





10.4. Usuwanie nieistotnych dla klasyfikacji cech

# Wczytanie bibliotek.
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2, f_classif

# Wczytanie danych.
iris = load_iris()
features = iris.data
target = iris.target

# Konwersja na dane kategoryzujące przez konwersję danych na liczby całkowite.
features = features.astype(int)

# Wybór dwóch cech o największych wartościach danych statystycznych chi-kwadrat.
chi2_selector = SelectKBest(chi2, k=2)
features_kbest = chi2_selector.fit_transform(features, target)

# Wyświetlenie wyników.
print("Początkowa liczba cech:", features.shape[1])
print("Liczba cech po redukcji:", features_kbest.shape[1])

Początkowa liczba cech: 4
Liczba cech po redukcji: 2





# Wybór dwóch cech o największych wartościach F.
fvalue_selector = SelectKBest(f_classif, k=2)
features_kbest = fvalue_selector.fit_transform(features, target)

# Wyświetlenie wyników.
print("Początkowa liczba cech:", features.shape[1])
print("Liczba cech po redukcji:", features_kbest.shape[1])

Początkowa liczba cech: 4
Liczba cech po redukcji: 2





# Wczytanie biblioteki.
from sklearn.feature_selection import SelectPercentile

# Wybranie pierwszych 75% cech o największych wartościach F.
fvalue_selector = SelectPercentile(f_classif, percentile=75)
features_kbest = fvalue_selector.fit_transform(features, target)

# Wyświetlenie wyników.
print("Początkowa liczba cech:", features.shape[1])
print("Liczba cech po redukcji:", features_kbest.shape[1])

Początkowa liczba cech: 4
Liczba cech po redukcji: 3





10.5. Rekurencyjne eliminowanie cech

# Wczytanie bibliotek.
import warnings
from sklearn.datasets import make_regression
from sklearn.feature_selection import RFECV
from sklearn import datasets, linear_model

# Pozbycie się irytującego, choć nieszkodliwego ostrzeżenia.
warnings.filterwarnings(action="ignore", module="scipy",
                        message="^internal gelsd")

# Wygenerowanie macierzy cech, wektora docelowego i prawdziwych współczynników.
features, target = make_regression(n_samples = 10000,
                                   n_features = 100,
                                   n_informative = 2,
                                   random_state = 1)

# Zdefiniowanie regresji liniowej.
ols = linear_model.LinearRegression()

# Rekurencyjne eliminowanie cech.
rfecv = RFECV(estimator=ols, step=1, scoring="neg_mean_squared_error")
rfecv.fit(features, target)
rfecv.transform(features)

array([[ 0.00850799,  0.7031277 ,  1.52821875],
       [-1.07500204,  2.56148527, -0.44567768],
       [ 1.37940721, -1.77039484, -0.74675125],
       ...,
       [-0.80331656, -1.60648007,  0.52231601],
       [ 0.39508844, -1.34564911,  0.4228057 ],
       [-0.55383035,  0.82880112,  1.73232647]])





# Liczba najlepszych cech.
rfecv.n_features_

3





# Sprawdzenie kategorii uznanych za najlepsze.
rfecv.support_

array([False, False, False, False, False,  True, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, True,  False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False,  False, False,
       False, False, False, False, False, False,  False, True, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False])





# Ranking cech od najlepszej (1) do najgorszej.
rfecv.ranking_

array([11, 92, 96, 87, 46,  1, 48, 23, 16,  2, 66, 83, 33, 27, 70, 75, 29,
       84, 54, 88, 37, 42, 85, 62, 74, 50, 80, 10, 38, 59, 79, 57, 44,  8,
       82, 45, 89, 69, 94,  1, 35, 47, 39,  1, 34, 72, 19,  4, 17, 91, 90,
       24, 32, 13, 49, 26, 12, 71, 68, 40,  1, 43, 63, 28, 73, 58, 21, 67,
        1, 95, 77, 93, 22, 52, 30, 60, 81, 14, 86, 18, 15, 41,  7, 53, 65,
       51, 64,  6,  9, 20,  5, 55, 56, 25, 36, 61, 78, 31,  3, 76])
