#!/usr/bin/env python # coding: utf-8 # ## Пробное программирование # In[2]: from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score from sklearn.model_selection import GridSearchCV, cross_val_score, train_test_split from sklearn.utils import shuffle import pandas as pd import numpy as np # Загружаем и "обрабатываем" данные. Как видно, все признаки имеют тип float, а тип стекла - int. # In[3]: df = pd.read_csv('glass.csv') df.drop(['Id'], axis = 1, inplace = True) df.dtypes # In[406]: df.head() # In[407]: df.tail() # Т.к. записи упорядочены по типу стекла, перемешаем строки. # In[4]: df = shuffle(df) df.head() # Разделим датасет на обучающую выборку и тест. Оставим на тест 30%. # In[5]: y = df['Type_of_glass'] X = df.copy() X.drop('Type_of_glass', axis = 1, inplace = True) X_train, X_holdout, y_train, y_holdout = train_test_split(X.values, y, test_size = .3) # ## Решающее дерево # In[410]: dec_tree = DecisionTreeClassifier(criterion='entropy') dec_tree.fit(X_train, y_train) dec_tree.score(X_train, y_train) # Если строить дерево без ограничения глубины, то оно идеально подстроится под обучающую выборку. # In[411]: dec_tree.score(X_holdout, y_holdout) # Точность на отложеных данных - 61.5%. # Теперь будем использовать кросс-валидацию. Оптимизируем максимальную глубину дерева. # In[412]: tree_params = {'max_depth': range(1, 11, 1)} cv_best_tree = GridSearchCV(dec_tree, tree_params, cv = 4, n_jobs = 4, verbose = True) cv_best_tree.fit(X_train, y_train) print("Best params:", cv_best_tree.best_params_) print("Best cross validaton score", cv_best_tree.best_score_) # Оптимальная глубина - 7. # In[413]: cv_best_tree.score(X_holdout, y_holdout) # Точность на отложенных данных - 63.1%. # ## Метод ближайших соседей # In[414]: knn = KNeighborsClassifier(n_neighbors = 10, n_jobs = 4) #10 ближайших соседей knn.fit(X_train, y_train) knn.score(X_train, y_train) # Метод ближайших соседей на обучающей выборке дает точность 67.8%. # In[415]: knn.score(X_holdout, y_holdout) # На отложенных данных - 64.6%. # Теперь будем оптимизировать количество ближайших соседей и их веса (одинаковые, либо то расстояния). # In[416]: weights = ['uniform', 'distance'] knn_params = {'n_neighbors': range(1, 21, 1), 'weights': weights} cv_best_knn = GridSearchCV(knn, knn_params, cv = 4, n_jobs = 4, verbose = True) cv_best_knn.fit(X_train, y_train) print("Best params:", cv_best_knn.best_params_) print("Best cross validaton score", cv_best_knn.best_score_) # Модель определила, что лучше всего использовать 3х соседей и веса, зависящие от расстояния. # In[417]: cv_best_knn.score(X_holdout, y_holdout) # Точность на тестовых данных - 69.2%. # ## Пробный анализ ошибки (метод ближайших соседей) # In[453]: import matplotlib.pyplot as plt from sklearn.metrics import mean_squared_error from sklearn.metrics import accuracy_score # Мы хотим построить графики зависимости значений ошибки и ее стандартного отклонения от объема выборки на обучении и контроле. # In[419]: df.shape # В датасете 214 записей. # In[425]: test_size = np.linspace(0.2, 0.8, 14) test_acc_error = [] test_squ_error = [] train_acc_error = [] train_squ_error = [] for i in test_size: X_train, X_holdout, y_train, y_holdout = train_test_split(X.values, y, test_size = i) cv_best_knn.fit(X_train, y_train) cv_best_knn_prediction_train = cv_best_knn.predict(X_train) cv_best_knn_prediction_test = cv_best_knn.predict(X_holdout) train_acc_error.append(1 - accuracy_score(cv_best_knn_prediction_train, y_train)) train_squ_error.append(mean_squared_error(cv_best_knn_prediction_train, y_train)) test_acc_error.append(1 - accuracy_score(cv_best_knn_prediction_test, y_holdout)) test_squ_error.append(mean_squared_error(cv_best_knn_prediction_test, y_holdout)) # In[452]: data_acc_err = pd.DataFrame(data=[test_size, test_acc_error, train_acc_error]).transpose() data_acc_err.columns = ['объем тестовых данных', 'средняя ошибка на тестовых данных', 'средняя ошибка на обучающей выборке'] data_squ_err = pd.DataFrame(data=[test_size, test_squ_error, train_squ_error]).transpose() data_squ_err.columns = ['объем тестовых данных', 'среднеквадратичная ошибка на тестовых данных', 'среднеквадратичная ошибка на обучающей выборке'] # In[454]: plt.plot( 'объем тестовых данных', 'средняя ошибка на тестовых данных', data=data_acc_err) plt.plot( 'объем тестовых данных', 'средняя ошибка на обучающей выборке', data=data_acc_err) plt.legend() # In[455]: plt.plot( 'объем тестовых данных', 'среднеквадратичная ошибка на тестовых данных', data=data_squ_err) plt.plot( 'объем тестовых данных', 'среднеквадратичная ошибка на обучающей выборке', data=data_squ_err) plt.legend()s