%%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_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)