рдврд╛рд▓ рдХреЗ рд╕рдорд╛рди рд╡рдВрд╢рдЬ рджреНрд╡рд╛рд░рд╛ k- рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЕрдиреНрдп рд╣рд╛рдЗрдкрд░рдкреИрд░рдореАрдЯрд░) рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдорд╣рддреНрд╡ рдХрд╛ рдЪрдпрди

рдПрдХ рд╕рдЪреНрдЪреА рдмрдХрд╡рд╛рд╕ рди рдХреЗрд╡рд▓ рдЕрд╕рдВрднрд╡ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ

рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ 18 рд╣рд╛рдЗрдкрд░рдкреИрд░рдореАрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдерд╛ рдХрд┐ рдХрд╛рд░реНрдп рдХреЛ рдХреНрд░реВрд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╢рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред

рдХреБрдЫ рд╕реАрдЦрддреЗ рд╕рдордп, рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдирдпрд╛ рд▓реЗрдХрд░ рдЖрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рдореИрдВ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдпрд╛рддреНрд░рд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдкреБрд░рд╕реНрдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдЙрдирдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдФрд░ рдЖрдВрддрд░рд┐рдХ рд╕реАрдорд╛рдУрдВ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рдХреА рд╕рдордЭ рдорд┐рд▓рддреА рд╣реИред рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

рдкрд╛рдпрдерди рдФрд░ рдбреАрдПрд╕ рдореЗрдВ, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╢реБрд░реБрдЖрддреА рд╣реВрдВ, рдФрд░ рдореИрдВ рдХрдИ рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдореЗрд░реА рдкреБрд░рд╛рдиреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдЖрджрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЯреАрдо рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕реЗ рдкрд╛рдпрдерди рдХрдИ рдмрд╛рд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкрд░рд┐рдорд╛рдг рдХреЗ рдЖрджреЗрд╢реЛрдВ рд╕реЗ рдзреАрдорд╛ рдХрд░рдХреЗ рджрдВрдбрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдкрдирд╛ рд╕рд╛рд░рд╛ рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП - рд╢рд░реНрдореАрд▓реА рди рд╣реЛрдВ, рд╡рд╣рд╛рдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред https://github.com/kraidiky/GDforHyperparameters

рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХреВрд▓ рдбреЗрдЯрд╛рдЯреИрдирд┐рд╕реНрдЯ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЬреАрд╡рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рд╡рд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рджреГрд╢реНрдп, рдЬреЛ рди рдХреЗрд╡рд▓ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реВрдкрдг


ODS.ai рд╕реЗ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ DS рдХреЛрд░реНрд╕ рд╣реИ рдФрд░ рддреАрд╕рд░рд╛ рд▓реЗрдХреНрдЪрд░ рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди, рдбрд┐рд╕реАрдЬрди рдЯреНрд░реАрдЬрд╝ рдФрд░ рдирдЬрджреАрдХреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ ред рд╡рд╣рд╛рдВ, рдпрд╣ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рдФрд░ рд╕рдВрднрд╡рдд: рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдбреЗрдЯрд╛ рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдирд┐рд░реНрдгрдп рд╡реГрдХреНрд╖ 94.5% рдХреА рд╕рдЯреАрдХрддрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХрд╢реНрдореАрд░ рдХреЗ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреА рдПрдХ рд╣реА рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ 89% рджреЗрддреА рд╣реИ

рдбреЗрдЯрд╛ рдЖрдпрд╛рдд рдФрд░ рд▓реЛрдб рдХрд░реЗрдВ
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')

df = pd.read_csv('data/telecom_churn.csv')
df['Voice mail plan'] = pd.factorize(df['Voice mail plan'])[0]
df['International plan'] = pd.factorize(df['International plan'])[0]
df['Churn'] = df['Churn'].astype('int32')
states = df['State']
y = df['Churn']
df.drop(['State','Churn'], axis = 1, inplace=True)
df.head()

рд▓рдХрдбрд╝реА рдХреА рддреБрд▓рдирд╛ рдШреБрдЯрдиреЗ рд╕реЗ рдХрд░реЗрдВ
%%time
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.metrics import accuracy_score

X_train, X_holdout, y_train, y_holdout = train_test_split(df.values, y, test_size=0.3,
random_state=17)

tree = DecisionTreeClassifier(random_state=17, max_depth=5)
knn = KNeighborsClassifier(n_neighbors=10)

tree_params = {'max_depth': range(1,11), 'max_features': range(4,19)}
tree_grid = GridSearchCV(tree, tree_params, cv=10, n_jobs=-1, verbose=False)
tree_grid.fit(X_train, y_train)
tree_grid.best_params_, tree_grid.best_score_, accuracy_score(y_holdout, tree_grid.predict(X_holdout))

({'max_depth': 6, 'max_features': 16}, 0.944706386626661, 0.945)

knn рдХреЗ рд▓рд┐рдП рд╣реА
%%time
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

knn_pipe = Pipeline([('scaler', StandardScaler()), ('knn', KNeighborsClassifier(n_jobs=-1))])
knn_params = {'knn__n_neighbors': range(1, 10)}
knn_grid = GridSearchCV(knn_pipe, knn_params, cv=10, n_jobs=-1, verbose=False)

knn_grid.fit(X_train, y_train)
knn_grid.best_params_, knn_grid.best_score_, accuracy_score(y_holdout, knn_grid.predict(X_holdout))

({'knn__n_neighbors тАЩ: 9}, 0.8868409772824689, 0.891)
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдмреЗрдИрдорд╛рди рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдШреБрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рдерд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рдореИрдВрдиреЗ рдкреЗрдбрд╝ рд╕реЗ feature_importances_ рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд┐рддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЙрддрдирд╛ рд╣реА рдмрдбрд╝рд╛ рдпреЛрдЧрджрд╛рди рдЕрдВрдХреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╣реИред

рд╣рдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдбреЗрдЯрд╛ рдЦрд┐рд▓рд╛рддреЗ рд╣реИрдВ
%%time
feature_importances = pd.DataFrame({'features': df.columns, 'importance':tree_grid.best_estimator_.feature_importances_})
print(feature_importances.sort_values(by=['importance'], inplace=False, ascending=False))

scaler = StandardScaler().fit(X_train)
X_train_transformed = scaler.transform(X_train)
X_train_transformed = X_train_transformed * np.array(feature_importances['importance'])

X_holdout_transformed = scaler.transform(X_holdout)
X_holdout_transformed = X_holdout_transformed * np.array(feature_importances['importance'])

knn_grid = GridSearchCV(KNeighborsClassifier(n_jobs=-1), {'n_neighbors': range(1, 11, 2)}, cv=5, n_jobs=-1, verbose=False)
knn_grid.fit(X_train_transformed, y_train)
print (knn_grid.best_params_, knn_grid.best_score_, accuracy_score(y_holdout, knn_grid.predict(X_holdout_transformed)))

5рдХреБрд▓ рджрд┐рди рдорд┐рдирдЯ0.270386
17рдЧреНрд░рд╛рд╣рдХ рд╕реЗрд╡рд╛ рдХреЙрд▓0.147185
8рдХреБрд▓ рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдорд┐рдирдЯ0.135475
2рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рдпреЛрдЬрдирд╛0.097249
рд╕реЛрд▓рд╣рдХреБрд▓ рдЗрдВрдЯрд▓ рдЪрд╛рд░реНрдЬ0.091671
рдкрдВрджреНрд░рд╣рдХреБрд▓ intl рдХреЙрд▓09.090008
4рдирдВрдмрд░ vmail рд╕рдВрджреЗрд╢0.050646
10рдХреБрд▓ рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рд╢реБрд▓реНрдХ0.038593
7рдХреБрд▓ рджрд┐рди рдХрд╛ рдкреНрд░рднрд╛рд░0.026422
3рд╡реЙрдпрд╕ рдореЗрд▓ рдкреНрд▓рд╛рди0.017068
рдЧреНрдпрд╛рд░рд╣рдХреБрд▓ рд░рд╛рдд рдорд┐рдирдЯ0.014185
рддреЗрд░рд╣рдХреБрд▓ рд░рд╛рдд рдХрд╛ рдЪрд╛рд░реНрдЬ0.005742
12рдХреБрд▓ рд░рд╛рдд рдХреА рдХреЙрд▓0.005502
9рдХреБрд▓ рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдХреЙрд▓0.003614
6рдХреБрд▓ рджрд┐рди рдХреЙрд▓0.002246
14рдХреБрд▓ рдЕрдВрддрд░ рдорд┐рдирдЯ0.002009
0Account length0.001998
1Area code0.000000

{[n_neighbors ': 5} 0.909129875696528 0.913

рдкреЗрдбрд╝ рдиреЗ рд╕рд┐рд░реНрдл рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬреНрдЮрд╛рди рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рд╣рдо 91% рджреЗрдЦрддреЗ рд╣реИрдВред рд╡реИрдирд┐рд▓рд╛ рдХреЗ рдкреЗрдбрд╝ рдХреЗ 94.5% рд╕реЗ рдЗрддрдирд╛ рджреВрд░ рдирд╣реАрдВ рд╣реИред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдПрдХ рдЖрдЗрдбрд┐рдпрд╛ рдЖрдпрд╛ред рд▓реЗрдХрд┐рди рдХреИрд╕реЗ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ knn рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рдЗрд╕реЗ "рдорд╛рдереЗ" рдХрд┐рддрдирд╛ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред 18 рдкреИрд░рд╛рдореАрдЯрд░, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрд╛рд░рдХреЛрдВ рдХреЗ 10 рд╕рдВрднрд╛рд╡рд┐рдд рдЪрд░рдгред рд╣рдореЗрдВ 10e18 рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рддреЗ рд╣реИрдВред рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдХрд▓реНрдк 10 рд╕реЗ рдХрдо рд╣реИ рдФрд░ рдХреНрд░реЙрд╕-рд╕рддреНрдпрд╛рдкрди рднреА 10 рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ 1.5 рд╕реЗрдХрдВрдбред рдпрд╣ 42 рдмрд┐рд▓рд┐рдпрди рд╡рд░реНрд╖ рдХрд╛ рд╣реИред рд╢рд╛рдпрдж рд░рд╛рдд рдХреЗ рд▓рд┐рдП рд░реЗрдХрд┐рдВрдЧ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред :) рдФрд░ рдЗрдзрд░ рдЙрдзрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, тАЬрдЕрд░реЗ! рддреЛ рдореИрдВ рдПрдХ рдмрд╛рдЗрдХ рдмрдирд╛рдКрдВрдЧрд╛ рдЬреЛ рдЙрдбрд╝ рдЬрд╛рдПрдЧреА! тАЭ

рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд╕рд░реНрдЪ


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдзрд┐рдХрддрдо рдЙрдкрд▓рдмреНрдз рд╣реИред рдЦреИрд░, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдПрдХ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╛рди рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдврд╛рд▓ рдХреЗ рд╕рд╛рде рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдмрд┐рдВрджреБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдиреБрд╡рдВрд╢рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЕрдиреБрдХреВрд▓реА рдХреНрд╖реЗрддреНрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╛рд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдУрд╡рд░рдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдореИрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рд╣рд╛рдЗрдкрд░рдкрд░рдореЗрдЯрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░рдХреЛрдВ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╕реНрдХреЗрд▓рд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрдЯреИрдВрдбрдЖрд░реНрдЯрд╕рд▓реНрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдирдореВрдиреЗ рдХреЛ рдФрд╕рдд рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рдЧреНрдорд╛ = 1. рдмрдирд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдЗрдкрд░рдкрд░рдореАрдЯрд░ рдХреЛ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреБрдЫ рдХреЗ рд▓рд┐рдП sklearn.preprocessing рдореЗрдВ рдкрдбрд╝реЗ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЦреЛрдЬ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдВрдбрд▓ рдХреЛ рд▓рдЯрдХрд╛рдХрд░ рд╕реНрдЯреИрдВрдбрдЖрд░реНрдЯрд╕реНрдХреЙрд▓рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдирд╛рдордорд╛рддреНрд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдФрд░ рдлрд┐рд░ рд╕реНрдХреЗрд▓реЗрд░рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдкреИрдорд╛рдиреЗ рдкрд░ рдереЛрдбрд╝рд╛ рдЧреБрдгрд╛ рдХрд░рдХреЗ
from sklearn.base import TransformerMixin
class StandardAndPoorScaler(StandardScaler, TransformerMixin):
    #normalization = None
    def __init__(self, copy=True, with_mean=True, with_std=True, normalization = None):
        #print("new StandardAndPoorScaler(normalization=", normalization.shape if normalization is not None else normalization, ") // ", type(self))
        self.normalization = normalization
        super().__init__(copy, with_mean, with_std)
    def fit(self, X, y=None):
        #print(type(self),".fit(",X.shape, ",", y.shape if y is not None else "<null>",")")
        super().fit(X, y)
        return self
    def partial_fit(self, X, y=None):
        #print(type(self),".partial_fit(",X.shape, ",", y.shape if y is not None else "<null>)")
        super().partial_fit(X, y)
        if self.normalization is None:
            self.normalization = np.ones((X.shape[1]))
        elif type(self.normalization) != np.ndarray:
            self.normalization = np.array(self.normalization)
        if X.shape[1] != self.normalization.shape[0]:
            raise "X.shape[1]="+X.shape[1]+" in equal self.scale.shape[0]="+self.normalization.shape[0]
    def transform(self, X, copy=None):
        #print(type(self),".transform(",X.shape,",",copy,").self.normalization", self.normalization)
        Xresult = super().transform(X, copy)
        Xresult *= self.normalization
        return Xresult
    def _reset(self):
        #print(type(self),"._reset()")
        super()._reset()
    
scaler = StandardAndPoorScaler(normalization = feature_importances['importance'])
scaler.fit(X = X_train, y = None)
print(scaler.normalization)

рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ
%%time
knn_pipe = Pipeline([('scaler', StandardAndPoorScaler()), ('knn', KNeighborsClassifier(n_jobs=-1))])

knn_params = {'knn__n_neighbors': range(1, 11, 4), 'scaler__normalization': [feature_importances['importance']]}
knn_grid = GridSearchCV(knn_pipe, knn_params, cv=5, n_jobs=-1, verbose=False)

knn_grid.fit(X_train, y_train)
knn_grid.best_params_, knn_grid.best_score_, accuracy_score(y_holdout, knn_grid.predict(X_holdout))

({'knn__n_neighbors тАЩ: 5, __ scaler__normalizationтАЩ: рдирд╛рдо: рдорд╣рддреНрд╡, dtype: float64}, 0.909558508358337, 0.913)

рдкрд░рд┐рдгрд╛рдо рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рднрд┐рдиреНрди рд╣реИред рдареАрдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмрд╕ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рддреАрди рдШрдВрдЯреЛрдВ рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╕рднреА рд╣рд┐рдореНрдордд рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдерд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкреНрд░рд┐рдВрдЯ рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреЗрд▓реЗрд░ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░рд┐рдбрд╕рд░реНрдЪрд╕реАрд╡реА рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдХреНрд▓реЛрди рдмрдирд╛рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬреЛ рдХреБрдЫ рдЖрдк рдЕрдиреНрдп рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдЧреБрдордирд╛рдореА рдореЗрдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк n_jobs = 1 рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рднреА рдХреЙрд▓ рдХреЛ рдкреНрдпрд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреНрдЮрд╛рди рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рдирд┐рдХрд▓рд╛, рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рднреА рд╣реИ, рдФрд░ рдЖрдкрдиреЗ рдПрдХ рдердХрд╛рдК рд▓реЗрдЦ рдкрдврд╝рдХрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЕрдм рдореИрдВ рдЙрдирдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднрд┐рдиреНрдирддрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдореВрд▓реНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдереЛрдбрд╝рд╛ рдХрдо рджреЗрдирд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЬрдм рддрдХ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рддрд╛ред рдпрд╣ рдкрд╣рд▓реА рдЕрд╕рднреНрдп рдЖрдзрд╛рд░ рд░реЗрдЦрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕реЗ рдЕрдВрддрддрдГ рдореЗрд░реЗ рд╕рдкрдиреЛрдВ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рдЬрди рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛
feature_base = feature_importances['importance']
searchArea = np.array([feature_base - .05, feature_base, feature_base + .05])
searchArea[searchArea < 0] = 0
searchArea[searchArea > 1] = 1
print(searchArea[2,:] - searchArea[0,:])

import itertools

affected_props = [2,3,4]
parametrs_ranges = np.concatenate([
    np.linspace(searchArea[0,affected_props], searchArea[1,affected_props], 2, endpoint=False),
    np.linspace(searchArea[1,affected_props], searchArea[2,affected_props], 3, endpoint=True)]).transpose()

print(parametrs_ranges) #      .  125 
recombinations = itertools.product(parametrs_ranges[0],parametrs_ranges[1],parametrs_ranges[1])

variances = []
for item in recombinations: #          ,       Python .
    varince = feature_base.copy()
    varince[affected_props] = item
    variances.append(varince)
print(variances[0])
print(len(variances))
#  knn   ,               .

рдЦреИрд░, рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рд╣реИред рдЕрдм рдореИрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк 15 рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рд╢реБрд░реВ рд╣реЛрдЧреАред

рд╣рдо рд▓реЗрдЦ рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ
%%time
#scale = np.ones([18])
knn_pipe = Pipeline([('scaler', StandardAndPoorScaler()), ('knn', KNeighborsClassifier(n_neighbors = 7 , n_jobs=-1))])

knn_params = {'scaler__normalization': variances} # 'knn__n_neighbors': range(3, 9, 2), 
knn_grid = GridSearchCV(knn_pipe, knn_params, cv=10, n_jobs=-1, verbose=False)

knn_grid.fit(X_train, y_train)
knn_grid.best_params_, knn_grid.best_score_, accuracy_score(y_holdout, knn_grid.predict(X_holdout))

рдЦреИрд░, рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИ, рд╕рдордп рдПрдХ рд╕рдлрд▓рддрд╛ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрд╕реНрдерд┐рд░ рд╣реИред рдпрд╣ рдПрдХреНрд╕_рд╣реЛрдЙрдЯ рдЪреЗрдХ рд╕реЗ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдПрдХ рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдХреА рддрд░рд╣ рдирд╛рдЪрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдореИрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╡реЗрдХ рдХреЗ рд╕рд╛рдеред

рдореИрдВ рдПрдХ 4 рдЧреБрдг рдмрджрд▓ рджреЗрддрд╛ рд╣реВрдВ
%%time
affected_property = 4
parametrs_range = np.concatenate([
    np.linspace(searchArea[0,affected_property], searchArea[1,affected_property], 29, endpoint=False),
    np.linspace(searchArea[1,affected_property], searchArea[2,affected_property], 30, endpoint=True)]).transpose()

print(searchArea[1,affected_property])
print(parametrs_range) # C   ,  .


variances = []
for item in parametrs_range: #          ,       Python .
    varince = feature_base.copy()
    varince[affected_property] = item
    variances.append(varince)
print(variances[0])
print(len(variances))
#  knn   ,               .

knn_pipe = Pipeline([('scaler', StandardAndPoorScaler()), ('knn', KNeighborsClassifier(n_neighbors = 7 , n_jobs=-1))])

knn_params = {'scaler__normalization': variances} # 'knn__n_neighbors': range(3, 9, 2), 
knn_grid = GridSearchCV(knn_pipe, knn_params, cv=10, n_jobs=-1, verbose=False)

knn_grid.fit(X_train, y_train)
knn_grid.best_params_, knn_grid.best_score_, accuracy_score(y_holdout, knn_grid.predict(X_holdout))

({0.0 scaler__normalization тАЩ: 4 0.079957 рдирд╛рдо: рдорд╣рддреНрд╡, dtype: float64}, 0.9099871410201458, 0.913)

рдЦреИрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдВрд╕ рдХреНрдпрд╛ рд╣реИ? рдХреНрд░реЙрд╕-рд╡реЗрд▓рд┐рдбреЗрд╢рди рдкрд░ рдПрдХ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рджреЛ рд╕реЗ рджрд╕рд╡реЗрдВ рднрд╛рдЧ рдХреА рд╢рд┐рдлреНрдЯ, рдФрд░ рдЕрдЧрд░ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рднрд╛рд╡рд┐рдд_рдкреНрд░рддрд┐рд╖реНрдард╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ X_holdout рдкрд░ рдЖрдзрд╛ рдкреНрд░рддрд┐рд╢рдд рдХреА рдЫрд▓рд╛рдВрдЧ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдФрд░ рд╕рд╕реНрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрдбрд╝ рд╣рдореЗрдВ рджреЗрддрд╛ рд╣реИ рддреЛ рдРрд╕реЗ рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ, рдЬреНрдЮрд╛рдд рд╡рдЬрди рд╡рд┐рддрд░рдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЫреЛрдЯреЗ рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЪрдХреНрд░ рдореЗрдВ рдПрдХ рдордирдорд╛рдирд╛ рдмрд┐рдВрджреБ рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рдиреЗ рдЖрдП рд╣реИрдВред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд░рдиреЗ
searchArea = np.array([np.zeros((18,)), np.ones((18,)) /18, np.ones((18,))])
print(searchArea[:,0])

history_parametrs = [searchArea[1,:].copy()]
scaler = StandardAndPoorScaler(normalization=searchArea[1,:])
scaler.fit(X_train)
knn = KNeighborsClassifier(n_neighbors = 7 , n_jobs=-1)
knn.fit(scaler.transform(X_train), y_train)
history_holdout_score = [accuracy_score(y_holdout, knn.predict(scaler.transform(X_holdout)))]

рдереЛрдбрд╝рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп (рдбрд┐рдмрдЧ рд▓реЙрдЧ рдХреЗ рд╕рд╛рде)
%%time
def changePropertyNormalization(affected_property, points_count = 15):
    test_range = np.concatenate([
        np.linspace(searchArea[0,affected_property], searchArea[1,affected_property], points_count//2, endpoint=False),
        np.linspace(searchArea[1,affected_property], searchArea[2,affected_property], points_count//2 + 1, endpoint=True)]).transpose()
    variances = [searchArea[1,:].copy() for i in range(test_range.shape[0])]
    for row in range(len(variances)):
        variances[row][affected_property] = test_range[row]
    
    knn_pipe = Pipeline([('scaler', StandardAndPoorScaler()), ('knn', KNeighborsClassifier(n_neighbors = 7 , n_jobs=-1))])
    knn_params = {'scaler__normalization': variances} # 'knn__n_neighbors': range(3, 9, 2), 
    knn_grid = GridSearchCV(knn_pipe, knn_params, cv=10, n_jobs=-1, verbose=False)

    knn_grid.fit(X_train, y_train)
    holdout_score = accuracy_score(y_holdout, knn_grid.predict(X_holdout))
    best_param = knn_grid.best_params_['scaler__normalization'][affected_property]
    print(affected_property,
          'property:', searchArea[1, affected_property], "=>", best_param,
          'holdout:', history_holdout_score[-1], "=>", holdout_score, '(', knn_grid.best_score_, ')')
    #             .
    before = searchArea[:, affected_property]
    propertySearchArea = searchArea[:, affected_property].copy()
    if best_param == propertySearchArea[0]:
        print('|<<')
        searchArea[0, affected_property] = best_param/2 if best_param > 0.01 else 0
        searchArea[2, affected_property] = (best_param + searchArea[2, affected_property])/2
        searchArea[1, affected_property] = best_param
    elif best_param == propertySearchArea[2]:
        print('>>|')
        searchArea[2, affected_property] = (best_param + 1)/2 if best_param < 0.99 else 1
        searchArea[0, affected_property] = (best_param + searchArea[0, affected_property])/2
        searchArea[1, affected_property] = best_param
    elif best_param < (propertySearchArea[0] + propertySearchArea[1])/2:
        print('<<')
        searchArea[0, affected_property] = max(propertySearchArea[0]*1.1 - .1*propertySearchArea[1], 0)
        searchArea[2, affected_property] = (best_param + propertySearchArea[2])/2
        searchArea[1, affected_property] = best_param
    elif best_param > (propertySearchArea[1] + propertySearchArea[2])/2:
        print('>>')
        searchArea[0, affected_property] = (best_param + propertySearchArea[0])/2
        searchArea[2, affected_property] = min(propertySearchArea[2]*1.1 - .1*propertySearchArea[1], 1)
        searchArea[1, affected_property] = best_param
    elif best_param < propertySearchArea[1]:
        print('<')
        searchArea[2, affected_property] = searchArea[1, affected_property]*.25 + .75*searchArea[2, affected_property]
        searchArea[1, affected_property] = best_param
    elif best_param > propertySearchArea[1]:
        print('>')
        searchArea[0, affected_property] = searchArea[1, affected_property]*.25 + .75*searchArea[0, affected_property]
        searchArea[1, affected_property] = best_param
    else:
        print('=')
        searchArea[0, affected_property] = searchArea[1, affected_property]*.25 + .75*searchArea[0, affected_property]
        searchArea[2, affected_property] = searchArea[1, affected_property]*.25 + .75*searchArea[2, affected_property]
    normalization = searchArea[1,:].sum() #,      .
    searchArea[:,:] /= normalization
    print(before, "=>",searchArea[:, affected_property])
    history_parametrs.append(searchArea[1,:].copy())
    history_holdout_score.append(holdout_score)
    
changePropertyNormalization(1, 9)
changePropertyNormalization(1, 9)

рдореИрдВрдиреЗ рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВрдиреЗ рд▓рдЧрднрдЧ рдЖрдзреЗ рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдирд┐рд░реНрдгрд╛рдпрдХ рдХрджрдо рдЙрдард╛рдпрд╛:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
40 .
%%time
#   
searchArea = np.array([np.zeros((18,)), np.ones((18,)) /18, np.ones((18,))])
print(searchArea[:,0])

history_parametrs = [searchArea[1,:].copy()]
scaler = StandardAndPoorScaler(normalization=searchArea[1,:])
scaler.fit(X_train)
knn = KNeighborsClassifier(n_neighbors = 7 , n_jobs=-1)
knn.fit(scaler.transform(X_train), y_train)
history_holdout_score = [accuracy_score(y_holdout, knn.predict(scaler.transform(X_holdout)))]

for tick in range(40):
    for p in range(searchArea.shape[1]):
        changePropertyNormalization(p, 7)
    
print(searchArea[1,:])
print(history_holdout_score)

рдШреБрдЯрдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдореА рд╕рдЯреАрдХрддрд╛: 91.9% рдЬрдм рд╣рдо рдкреЗрдбрд╝ рд╕реЗ рдбреЗрдЯрд╛ рдлрд╛рдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред рдирд┐рд░реНрдгрдп рд╡реГрдХреНрд╖ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

рдШреБрдЯрдиреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдорд╣рддреНрд╡ рдХрд╛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди
feature_importances['knn_importance'] = history_parametrs[-1]
diagramma = feature_importances.copy()
indexes = diagramma.index
diagramma.index = diagramma['features']
diagramma.drop('features', 1, inplace = True)
diagramma.plot(kind='bar');
plt.savefig("images/pic1.png", format = 'png')
plt.show()
feature_importances





рд▓рдЧрддрд╛ рд╣реИ? рд╣рд╛рдБ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдорд╛рди рд╕реЗ рджреВрд░ред рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд▓реЛрдХрдиред рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 'рдЯреЛрдЯрд▓ рдирд╛рдЗрдЯ рдорд┐рдирдЯ' рдФрд░ 'рдЯреЛрдЯрд▓ рдирд╛рдЗрдЯ рдЪрд╛рд░реНрдЬ'ред рддреЛ рдзреНрдпрд╛рди рджреАрдЬрд┐рдП, knn рдиреЗ рдЦреБрдж рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рджреЛрд╣рд░рд╛рдИ рдЧрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рджреЗрдЦрд╛ред

рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдХрд╛рдо рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ ...ред
parametrs_df = pd.DataFrame(history_parametrs)
parametrs_df['scores'] = history_holdout_score
parametrs_df.index.name = 'index'
parametrs_df.to_csv('parametrs_and_scores.csv')

рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


рдЦреИрд░, рдкрд░рд┐рдгрд╛рдо .919 рдкреНрд░рддрд┐ sen knn рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗрдирд┐рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1.5 рдЧреБрдирд╛ рдХрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдЬрдм рд╣рдо рдбреНрд░рд╛рдЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП feature_importance рдЯреНрд░реА рд▓реЗрддреЗ рд╣реИрдВ рддреЛ 7% рдХрдо рд╣реИред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ knn рдХреЗ рдЕрдиреБрд╕рд╛рд░ feature_importance рд╣реИред рдпрд╣ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ рдЬреЛ рдкреЗрдбрд╝ рдиреЗ рд╣рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЗрдбрд╝ рдФрд░ рдЪрд╛рдХреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдп рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╕рдВрдХреЗрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

рдЦреИрд░, рдЕрдВрдд рдореЗрдВред рд╣рдореЗрдВ

рдЕрдЬрдЧрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд░рд▓ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд╡реНрдпрд╛рдЦреНрдпрд╛рди mlcourse.ai ods рдФрд░ Google рдХреЗ рдЬреНрдЮрд╛рди рдХрд╛ рднрдВрдбрд╛рд░ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдП рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХреБрдЫ рдорд┐рд▓реЗ ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдм рд╕реНрд▓рд╛рдЗрдб


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рдо рдХрд╛ рдПрдХ рдмрд╛рдпрдкреНрд░реЛрдбрдХреНрдЯ рд╡рд╣ рдкрде рд╣реИ рдЬреЛ рдЙрд╕рдиреЗ рдпрд╛рддреНрд░рд╛ рдХреА рд╣реИред рдкрде, рд╣рд╛рд▓рд╛рдВрдХрд┐, 18-рдЖрдпрд╛рдореА рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╕реАрдЦрдиреЗ рдпрд╛ рдХрдЪрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреА рдЬрд╛рдЧрд░реВрдХрддрд╛ рдХреЛ рдереЛрдбрд╝реА-рдереЛрдбрд╝реА, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдЗрддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рддреНрд░реБрдЯрд┐ рдЕрдиреБрд╕реВрдЪреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрд╢рд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдзреНрдпрд╛рди рд╕реЗ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд╣реИ, рдЕрдиреБрдХреВрд▓реА рдЬрдЧрд╣ рдореЗрдВ рдПрдХ рд▓рдВрдмреА рд╕рдВрдХреАрд░реНрдг рдШрд╛рдЯреА рдХреЗ рд╕рд╛рде рд░реЗрдВрдЧрддреЗ рд╣реБрдПред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░реВрдВрдЧрд╛, рдкрд╣рд▓рд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рджреГрд╖реНрдЯрд┐рдХреЛрдг - рдореИрдВ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдкрд░ рдПрдХ 18-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдпреЛрдЧрджрд╛рди, рдЙрдирдХреЗ рдорд╣рддреНрд╡ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдПрдХрд▓ рд╣реЛред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, 18-рдЖрдпрд╛рдореА рдкрде рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдереНрд░реЛ рдкрд░ рдЭрд╛рдБрдХ рд░рд╣рд╛ рд╣реИ рдореИрдВ рд╡реИрд╕реЗ рд╣реА рд╕рднреА рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдХреЗ рддрд░рд╛рдЬреВ рдХреЗ рд╕реНрдерд╛рди рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкрд╛рд╕ рдерд╛ рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдерд╛ред

рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рд╛ рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдХрд╛рдо рдкрд░ рд▓реМрдЯрддрд╛ рд╣реВрдВ, рддреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдЦреБрдж рд╣реА рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ
parametrs_df = pd.read_csv('parametrs_and_scores.csv', index_col = 'index')
history_holdout_score = np.array(parametrs_df['scores'])
parametrs_df.drop('scores',axis=1)
history_parametrs = np.array(parametrs_df.drop('scores',axis=1))

рд╕рддреНрдпрд╛рдкрди рдкрд░ рддреНрд░реБрдЯрд┐ рдХреБрдЫ рдмрд┐рдВрджреБ рд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреЗ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрдбрд╝рд╛рд╡ рдореЗрдВ рдкреЗрдВрдЪ рдХрд░рдирд╛ рдФрд░ рдореЗрд░реЗ рдЬреАрд╡рди рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рд╕рдордп рд╣реИред :(

рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдирд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╣реИред
last = history_holdout_score[-1]
steps = np.arange(0, history_holdout_score.shape[0])[history_holdout_score != last].max()
print(steps/18)

35.5555555555555556
рд╣рдордиреЗ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрдиреБрдХреВрд▓рди рдЪрдХреНрд░ рдореЗрдВ 18 рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 36 рд╕рд╛рд░реНрдердХ рдХрджрдо рдереЗ, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред рдЕрдм рдЖрдЗрдП рдЙрд╕ рдкреНрд░рдХреНрд╖реЗрдк рдкрде рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
%%time
#    :
import matplotlib.pyplot as plt
%matplotlib inline
import random
import math
random.seed(17)
property_projection = np.array([[math.sin(a), math.cos(a)] for a in [random.uniform(-math.pi, math.pi) for i in range(history_parametrs[0].shape[0])]]).transpose()
history = np.array(history_parametrs[::18]) #   - 18 .
#           . :(
points = np.array([(history[i] * property_projection).sum(axis=1) for i in range(history.shape[0])])
plt.plot(points[:36,0],points[0:36,1]);
plt.savefig("images/pic2.png", format = 'png')
plt.show()



рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╛рддреНрд░рд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдкрд╣рд▓реЗ рдЪрд╛рд░ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреВрд░рд╛ рд╣реБрдЖ рдерд╛ред рдЖрдЗрдП рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдмрдврд╝рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВ

рдкрд╣рд▓реЗ 4 рдЕрдВрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛
plt.plot(points[4:36,0],points[4:36,1]);
plt.savefig("images/pic3.png", format = 'png')



рдЖрдЗрдП рдкрде рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╢рд┐рдХреНрд╖рдХ рдиреЗ рдЕрдкрдиреЗ рдЧрдВрддрд╡реНрдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рдХрд┐рдпрд╛ред

рдХрд░реАрдм рдЖ рд░рд╣реЗ рд╣реИрдВ
plt.plot(points[14:36,0],points[14:36,1]);
plt.savefig("images/pic4.png", format = 'png')
plt.show()
plt.plot(points[24:36,0],points[24:36,1]);
plt.plot(points[35:,0],points[35:,1], color = 'red');
plt.savefig("images/pic5.png", format = 'png')
plt.show()





рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рддреАрд╡реНрд░рддрд╛ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЬрдм рддрдХ рдЙрд╕реЗ рдЕрдкрдиреА рдордВрдЬрд┐рд▓ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддреАред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБ, рдХреНрд░реЙрд╕-рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХреА рд╕рд╛рдорд╛рдиреНрдп рддрд╕реНрд╡реАрд░ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИред

рд╡реИрд╕реЗ, рдореИрдВрдиреЗ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢реЗрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреИрдорд╛рдиреЗ рдХреЗ рдЪреМрд░рд╕рд╛рдИ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдХреБрдЫ рдХрджрдоред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рдЕрдиреНрдп рд▓реЗрдЦ, "рд╡реА рд╕реНрдкрд╛рдИ рдСрди рдж рдереНрд░реЛ рдСрди рдЕ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ" рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╣рд╛рдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рд░ рдХреЛрдИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╢реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рддреБрд░рдВрдд рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░рдХреЛрдВ рдХрд╛ рд╡рдЬрди, рдорд╣рддреНрд╡ рд╕рдорд╛рди рд╣реИ, рдлрд┐рд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рд╕рд┐рдиреИрдкреНрд╕ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡рдЬрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдХрдо рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд┐рдХрд▓рд╛ред

рдЗрд╕ рдмрд╛рд░, рдирдП рдЬреНрдЮрд╛рди рд╕реЗ рд▓реИрд╕, рдореИрдВ рдПрдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореЗрдВ рдмрд╣реБ-рдЖрдпрд╛рдореА рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреА-рдПрд╕рдПрдирдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЯреА SNE
%%time
import sklearn.manifold as manifold
tsne = manifold.TSNE(random_state=19)
tsne_representation = tsne.fit_transform(history)
plt.plot(tsne_representation[:, 0], tsne_representation[:, 1])
plt.savefig("images/pic6.png", format = 'png')
plt.show();



t-Sne рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдиреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдЦрд╛ рдЬрд╛рдП рдЬреЛ рдЬрд▓реНрджреА рд╕реЗ рдмрджрд▓рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рддрд╕реНрд╡реАрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛ рдЧрдИред рдирд┐рд╖реНрдХрд░реНрд╖ - рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЦрд┐рд╕рдХрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВ рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИрдВ: \ _

рдЖрдк рдЖрдЧреЗ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ


рдореИрдВрдиреЗ рдордзреНрдпрд╡рд░реНрддреА рдЕрдиреБрдХреВрд▓рди рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрджрд░ tsne рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдХрд┐ рд╕реБрдВрджрд░рддрд╛ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдВрджрд░рддрд╛ рдирд╣реАрдВ, рдХреБрдЫ рдХрдЪрд░рд╛ рдирд┐рдХрд▓рд╛ред рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ, рддреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рд╡реЗ рдкреЙрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ sklearn.manifold.t_sne рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди _gradient_descent рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИ , рдФрд░ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдЪрд░ рдХреЗ рдЙрдкрдЪрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдмрд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд╣рд╛рдВ рд╕реЗ

рдЙрдард╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдЦреБрдж рдХреЗ рдЪрд░ рдореЗрдВ рдордзреНрдпрд╡рд░реНрддреА рдбрдВрдк рдЬреЛрдбрд╝рддрд╛ рд╣реИ: рдкрджреЛрдВ редappend (p.copy ()) # рд╣рдо рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред

рдФрд░ рдлрд┐рд░, рдЬреИрд╕реЗ, рд╣рдо рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛрдб
from time import time
from scipy import linalg
# This list will contain the positions of the map points at every iteration.
positions = []
def _gradient_descent(objective, p0, it, n_iter,
                      n_iter_check=1, n_iter_without_progress=300,
                      momentum=0.8, learning_rate=200.0, min_gain=0.01,
                      min_grad_norm=1e-7, verbose=0, args=None, kwargs=None):
    # The documentation of this function can be found in scikit-learn's code.
    if args is None:
        args = []
    if kwargs is None:
        kwargs = {}

    p = p0.copy().ravel()
    update = np.zeros_like(p)
    gains = np.ones_like(p)
    error = np.finfo(np.float).max
    best_error = np.finfo(np.float).max
    best_iter = i = it

    tic = time()
    for i in range(it, n_iter):
        positions.append(p.copy()) # We save the current position.
        
        check_convergence = (i + 1) % n_iter_check == 0
        # only compute the error when needed
        kwargs['compute_error'] = check_convergence or i == n_iter - 1

        error, grad = objective(p, *args, **kwargs)
        grad_norm = linalg.norm(grad)

        inc = update * grad < 0.0
        dec = np.invert(inc)
        gains[inc] += 0.2
        gains[dec] *= 0.8
        np.clip(gains, min_gain, np.inf, out=gains)
        grad *= gains
        update = momentum * update - learning_rate * grad
        p += update

        if check_convergence:
            toc = time()
            duration = toc - tic
            tic = toc

            if verbose >= 2:
                print("[t-SNE] Iteration %d: error = %.7f,"
                      " gradient norm = %.7f"
                      " (%s iterations in %0.3fs)"
                      % (i + 1, error, grad_norm, n_iter_check, duration))

            if error < best_error:
                best_error = error
                best_iter = i
            elif i - best_iter > n_iter_without_progress:
                if verbose >= 2:
                    print("[t-SNE] Iteration %d: did not make any progress "
                          "during the last %d episodes. Finished."
                          % (i + 1, n_iter_without_progress))
                break
            if grad_norm <= min_grad_norm:
                if verbose >= 2:
                    print("[t-SNE] Iteration %d: gradient norm %f. Finished."
                          % (i + 1, grad_norm))
                break

    return p, error, i

manifold.t_sne._gradient_descent = _gradient_descent

`` рддрдп '' рдЯреА-рдПрд╕рдПрдирдИ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
tsne_representation = manifold.TSNE(random_state=17).fit_transform(history)
X_iter = np.dstack(position.reshape(-1, 2) for position in positions)
position_reshape = [position.reshape(-1, 2) for position in positions]
print(position_reshape[0].shape)
print('[0] min', position_reshape[0][:,0].min(),'max', position_reshape[0][:,0].max())
print('[1] min', position_reshape[1][:,0].min(),'max', position_reshape[1][:,0].max())
print('[2] min', position_reshape[2][:,0].min(),'max', position_reshape[2][:,0].max())

(41, 2)
[0] рдорд┐рдирдЯ -реж.режрежрежрезреорезреореорезреирей рдЕрдзрд┐рдХрддрдо .режрежрежреиренреирежренрепрелрел
[1] рдорд┐рдирдЯ -реж.режрелрезрейремреиремреп рдЕрдзрд┐рдХрддрдо .режрей,реирем,режрен,ремреиреи
[2] рдорд┐рдирдЯ -рек.рейрепреирейрежреп рдЕрдзрд┐рдХрддрдо рен.репреж,ренрек,релреирем
рдореВрд▓реНрдпреЛрдВ, рдПрдХ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдиреГрддреНрдп рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реЛрдЧрд╛ред рдЪрдХреНрд░реЛрдВ рдкрд░, рдпрд╣ рд╕рдм рдзреАрд░реЗ-рдзреАрд░реЗ рдХреЗрдкреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред :(

рдореИрдВ рдкреИрдорд╛рдиреЗ рдкрд░
%%time
from sklearn.preprocessing import MinMaxScaler
minMaxScaler = MinMaxScaler()
minMaxScaler.fit_transform(position_reshape[0])
position_reshape = [minMaxScaler.fit_transform(frame) for frame in position_reshape]
position_reshape[0].min(), position_reshape[0].max()

рдЪреЗрддрди
%%time

from matplotlib.animation import FuncAnimation, PillowWriter
#plt.style.use('seaborn-pastel')

fig = plt.figure()

ax = plt.axes(xlim=(0, 1), ylim=(0, 1))
line, = ax.plot([], [], lw=3)

def init():
    line.set_data([], [])
    return line,
def animate(i):
    x = position_reshape[i][:,0]
    y = position_reshape[i][:,1]
    line.set_data(x, y)
    return line,

anim = FuncAnimation(fig, animate, init_func=init, frames=36, interval=20, blit=True, repeat_delay = 1000)
anim.save('images/animate_tsne_learning.gif', writer=PillowWriter(fps=5))



рдпрд╣ рдХреМрд╢рд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рд░реНрдп рдФрд░ рдмрджрд╕реВрд░рдд рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдмреЗрдХрд╛рд░ рд╣реИред

рдЗрд╕ рдкрд░ рдореИрдВ рдЖрдкрдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рдд рд╕реЗ рднреА рдХрд┐ рдШреБрдЯрдиреЗ рд╕реЗ рднреА рдЖрдкрдХреЛ рдХреБрдЫ рдирдпрд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рднреА рдЖрдкрдХреЛ рдкреНрд▓реЗрдЧ рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдмреМрджреНрдзрд┐рдХ рджрд╛рд╡рдд рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдордЬрд╝рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред

All Articles