<jupyter_start><jupyter_text>Лабораторная работа 9Понижение размерности признакового пространстваВыполнил: <NAME> (6132-010402D)<jupyter_code>import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

from sklearn.manifold import TSNE
from sklearn.decomposition import PCA, TruncatedSVD
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from warnings import filterwarnings

filterwarnings("ignore")<jupyter_output><empty_output><jupyter_text>Найти датасет (желательно датасет для многоклассовой классификации, либо дадасет из предыдущей работы с результатами кластеризации) с большим количеством вещественных признаков (от 20-ти шт.). Добавьте описание датасета (в случае большого количества однотипных признаков, достаточно краткое описание на ваше усмотрение).<jupyter_code>df = pd.read_csv("2018_Financial_Data.csv", index_col="Unnamed: 0")
print(f"Размерность данных: {df.shape}")
df.sample(5)
df.describe()
df.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
Index: 4392 entries, CMCSA to ZYME
Columns: 224 entries, Revenue to Class
dtypes: float64(222), int64(1), object(1)
memory usage: 7.5+ MB<jupyter_text>Визуализируйте точки из исходного признакового пространства в 2-мерном пространстве двух признаков, используя алгоритм t-SNE (sklearn.manifold.TSNE). Цвет точек пусть отражает метки классов (или номера кластеров из предыдущей работы).<jupyter_code>df["Sector"], _ = pd.factorize(df["Sector"])
df = df.fillna(df.mean())
X = df.drop("Class", axis=1)
%%time
_TSNE = TSNE(n_components=2, n_iter=250)
_TSNE_DATA = _TSNE.fit_transform(X)
plt.figure(figsize=(15,15))
plt.title("TSNE")
sns.scatterplot(x=_TSNE_DATA[:, 0], y=_TSNE_DATA[:, 1], hue=df["Class"])<jupyter_output><empty_output><jupyter_text>Визуализируйте точки из исходного признакового пространства в 2-мерном пространстве, используя метод главных компонент (sklearn.decomposition.PCA) или Truncated SVD (sklearn.decomposition.TruncatedSVD). Цвет точек пусть отражает метки классов (или номера кластеров из предыдущей работы).<jupyter_code>%%time
_PCA = PCA(n_components=2)
_PCA_DATA = _PCA.fit_transform(X)
plt.figure(figsize=(15,15))
plt.title("PCA")
sns.scatterplot(x=_PCA_DATA[:, 0],y=_PCA_DATA[:, 1], hue=df["Class"])
%%time
_TSVD = TruncatedSVD(n_components=2 ,n_iter=777)
_TSVD_DATA = _TSVD.fit_transform(X)
plt.figure(figsize=(15, 15))
plt.title("TruncatedSVD")
sns.scatterplot(x=_TSVD_DATA[:, 0], y=_TSVD_DATA[:, 1], hue=df["Class"])<jupyter_output><empty_output><jupyter_text>На практике, как правило, выбирают столько главных компонент, чтобы оставить 90% дисперсии исходных данных. Чтобы оценить необходимое количество компонент, постройте график Number of components / Total explained variance. Пример построения есть в статье от ODS.<jupyter_code>C_Ratio = PCA().fit(X).explained_variance_ratio_ * 100
C_Ratio.shape
plt.plot(range(C_Ratio.size), C_Ratio)
plt.xlabel("PCA Feature")
plt.ylabel("Explained variance ratio")
plt.plot(range(C_Ratio.size), np.cumsum(C_Ratio))
plt.xlabel("PCA Feature")
plt.ylabel("Total explained variance ratio")<jupyter_output><empty_output><jupyter_text>Используя любой алгоритм классификации, исследуйте влияние понижения размерности признакового пространства на качество классификации. Обучите модель, используя все признаки,затем обучите модель после понижения признаковго пространства. Сравните метрики качества двух моделей. Сделайте выводы. Для выполнения данного задания набор данных можете взять новый.<jupyter_code>RFC = RandomForestClassifier()
scaler = StandardScaler()
X, y = df.drop(columns=["Class"], axis=1), df["Class"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.45, random_state=1)
%%time
_pipe = make_pipeline(scaler, RFC)
_pipe.fit(X_train, y_train)
predidct = _pipe.predict(X_test)
print(f"Score on Train: {_pipe.score(X_train, y_train)}")
print(f"Score on Test: {_pipe.score(X_test, y_test)}")
%%time

for i in range(1, 11):
    print(f"Iteration: {i}")
    _pipe = make_pipeline(scaler, PCA(n_components=i), RFC)
    _pipe.fit(X_train, y_train)
    predict = _pipe.predict(X_test)
    print(f"Score on Train: {_pipe.score(X_train, y_train)}")
    print(f"Score on Test: {_pipe.score(X_test, y_test)}")
    print("------------------------------")
plt.figure(figsize=(15, 15))
sns.heatmap(X.corr(), cmap="mako")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1221357063403782, 'fraction_numerical': 0.018687430478309234, 'mean_word_length': 7.310536044362292, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '347250', 'license': 'MIT', 'n_tokens_mistral': 1816, 'n_tokens_neox': 1914, 'n_words': 373, 'path': 'lab9_dim_reduction_6132_Novitskiy.ipynb', 'repo_name': 'nvnovitskiy/data-analysis-tools', 'size': '4504'}