Решил я познакомится с такой интересной для меня областью, как 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/
Добавить комментарий