Машинное обучение от Octave\Matlab к Python

от автора

Решил я познакомится с такой интересной для меня областью, как Machine learning. После непродолжительных поисков я обнаружил достаточно популярный курс Стэнфордского университета Machine learning. В нем рассказываются основы и дается широкое представление о machine learning, datamining, and statistical pattern recognition. Был для меня в этом курсе небольшой минус как Python программиста- домашние задания надо было выполнять на Octave\Matlab. В итоге я не пожалел, что получил представления о новом языке программирования, но как учебный пример для более тесного знакомства с соответствующими библиотеками решил переписать домашние задания на Python. То что получилось лежит на GitHub тут.

if __name__ == '__main__':     data = sio.loadmat('ex6data1.mat')     y = data['y'].astype(np.float64)     X = data['X']      visualize_boundary_linear(X, y, None)      C = 1     model = svm_train(X, y, C, linear_kernel, 0.001, 20)     visualize_boundary_linear(X, y, model)      C = 100     model = svm_train(X, y, C, linear_kernel, 0.001, 20)     visualize_boundary_linear(X, y, model)      x1 = np.array([1, 2, 1], dtype=np.float64)     x2 = np.array([0, 4, -1], dtype=np.float64)     sigma = 2.0     sim = gaussian_kernel(x1, x2, sigma);      print('Gaussian Kernel between x1 = [1; 2; 1], x2 = [0; 4; -1], sigma = 0.5 : (this value should be about 0.324652)')     print('Actual = {}'.format(sim))      data = sio.loadmat('ex6data2.mat')     y = data['y'].astype(np.float64)     X = data['X']      visualize_data(X, y).show()      C = 1.0     sigma = 0.1      partialGaussianKernel = partial(gaussian_kernel, sigma=sigma)     partialGaussianKernel.__name__ = gaussian_kernel.__name__     model= svm_train(X, y, C, partialGaussianKernel)     visualize_boundary(X, y, model)      data = sio.loadmat('ex6data3.mat')     y = data['y'].astype(np.float64)     X = data['X']     Xval = data['Xval']     yval = data['yval'].astype(np.float64)      visualize_data(X, y).show()      best_C = 0     best_sigma = 0     best_error = len(yval)     best_model = None      for C in [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30]:         for sigma in [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30]:             partialGaussianKernel = partial(gaussian_kernel, sigma=sigma)             partialGaussianKernel.__name__ = gaussian_kernel.__name__              model= svm_train(X, y, C, partialGaussianKernel)             ypred = svm_predict(model, Xval)             error = np.mean(ypred != yval.ravel())             if error < best_error:                 best_error = error                 best_C = C                 best_sigma = sigma                 best_model = model      visualize_boundary(X, y, best_model) 

Но так как Python есть своя популярная библиотека для этих целей scikit-learn, я попытался переписать некоторые задания с использованием этой возможности(соответствующие файлы с суффиксом sklearn). Как и требовалось ожидать код с библиотекой работает быстрые и выглядит компактнее и понятнее(с моей точки зрения).

if __name__ == '__main__':     data = sio.loadmat('ex6data1.mat')     y = data['y'].astype(np.float64).ravel()     X = data['X']     visualize_boundary(X, y, None)      C = 1     lsvc = LinearSVC(C=C, tol=0.001)     lsvc.fit(X, y)     svc = SVC(C=C, tol=0.001, kernel='linear')     svc.fit(X, y)     visualize_boundary(X, y, {'SVM(linear kernel) C = {}'.format(C): svc,                               'LinearSVC C = {}'.format(C): lsvc})      C = 100     lsvc = LinearSVC(C=C, tol=0.001)     lsvc.fit(X, y)     svc = SVC(C=C, tol=0.001, kernel='linear')     svc.fit(X, y)     visualize_boundary(X, y, {'SVM(linear kernel) C = {}'.format(C): svc,                               'LinearSVC C = {}'.format(C): lsvc})      data = sio.loadmat('ex6data2.mat')     y = data['y'].astype(np.float64).ravel()     X = data['X']      visualize_boundary(X, y)      C = 1.0     sigma = 0.1     gamma = sigma_to_gamma(sigma)     svc = SVC(C=C, tol=0.001, kernel='rbf', gamma=gamma)     svc.fit(X, y)     visualize_boundary(X, y, {'SVM(rbf kernel) C = {}'.format(C): svc})      data = sio.loadmat('ex6data3.mat')     y = data['y'].astype(np.float64).ravel()     X = data['X']     Xval = data['Xval']     yval = data['yval'].astype(np.float64).ravel()     visualize_boundary(X, y)      C_coefs = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30]     sigma_coefs = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30]      svcs = (SVC(C=C, gamma=sigma_to_gamma(sigma), tol=0.001, kernel='rbf') for C in C_coefs for sigma in sigma_coefs)     best_model = max(svcs, key=lambda svc: svc.fit(X, y).score(Xval, yval))     visualize_boundary(X, y, {'Best model(C={}, gamma={})'.format(best_model.C, best_model.gamma): best_model})      #Let's do the similar thing but using sklearn feature     X_all = np.vstack((X, Xval))     y_all = np.concatenate((y, yval))      parameters = {'C':C_coefs, 'gamma': map(sigma_to_gamma, sigma_coefs)}     svr = SVC(tol=0.001, kernel='rbf')     clf = GridSearchCV(svr, parameters, cv=2)     clf.fit(X_all, y_all)     visualize_boundary(X, y, {'Best model(C={}, gamma={})'.format(clf.best_params_['C'], clf.best_params_['gamma']): clf})  

P.S.
Для тех кому интересна библиотека Sklearn я бы посоветовал:
Курс на udacity
Видео 1 с pycon
Видео 2 с pycon

P.P.S
Для разработки и запуска примеров я использовал дистрибутив Anaconda

ссылка на оригинал статьи https://habrahabr.ru/post/276369/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *