导入
MNIST:手写数字数据集
练习并比较简单的逻辑回归与支持向量机。
1# required imports 2import pandas as pd 3import numpy as np 4import matplotlib.pyplot as plt 5import seaborn as sns 6sns.set(font_scale=1.3) # setting font size for the whole notebook 7sns.set_style("white") # want to set the style 8 9from sklearn import svm, linear_model, datasets 10from sklearn.model_selection import cross_val_score
1# loading handwritten digits dataset! 2mnist = datasets.load_digits() 3print(mnist.keys())
1df=pd.DataFrame(data=mnist.data,columns=mnist.feature_names) 2df['target']=mnist.target 3print("We have {} numbers/observations in the data.".format(len(df))) 4print("Unique target values are: \n{} \nand the respective class balance is: \n{}".format( 5 df.target.unique(), df.target.value_counts().sort_index().values)) 6print(df.tail(2))
1index=-2 # 1, 5 or some other available index 2number_at_0_index=np.array(df.drop('target',axis=1).iloc[index]).reshape(8,8) 3print("target value is: {}".format(int(df.iloc[index][-1]))) 4plt.imshow(number_at_0_index,cmap=plt.cm.viridis);
1# The same number as above 2plt.imshow(mnist.images[index], cmap=plt.cm.gray_r)#, interpolation='nearest') 3plt.show()
1# features and the target 2digits_X, digits_y = df.drop('target',axis=1), df.target 3 4# Logistic regression without doing anything 5print("Cross-validated mean scores:") 6LogR = linear_model.LogisticRegression(multi_class='multinomial') 7print("\tUsing logistic regression is\t\t: {}".format( 8 cross_val_score(estimator=LogR,X=digits_X, 9 y=digits_y,cv=5,scoring='accuracy').mean())) 10 11# SVM with linear kernel 12svc_linear = svm.SVC(kernel='linear')#,decision_function_shape='ovr') 13svc_linear.fit(digits_X,digits_y) 14print("\n\tUsing svc with linear kernel is\t\t: {}".format( 15 cross_val_score(estimator=svc_linear,X=digits_X, 16 y=digits_y,cv=5,scoring='accuracy').mean())) 17 18# SVM with polynomial kernel 19svc_poly = svm.SVC(kernel='poly') 20svc_poly.fit(digits_X,digits_y) 21print("\tUsing svc with polynomial kernel is\t: {}".format( 22 cross_val_score(estimator=svc_poly,X=digits_X, 23 y=digits_y,cv=5,scoring='accuracy').mean())) 24 25# SVM with rbf (aka gaussian) kernel - default 26svc_rbf = svm.SVC(kernel='rbf') 27svc_rbf.fit(digits_X,digits_y) 28print("\tUsing svc with rbf kernel is\t\t: {}".format( 29 cross_val_score(estimator=svc_rbf,X=digits_X, 30 y=digits_y,cv=5,scoring='accuracy').mean()))
1# This will take some time, let's note the time using the time module 2import time 3start=time.time() 4from sklearn.model_selection import GridSearchCV 5 6# The model 7model = svm.SVC() 8 9#parameters grid 10gamma_values = np.logspace(-5, 2, 10) 11C_values = np.logspace(-3, 2, 10) 12kernels = ['rbf', 'sigmoid', 'linear', 'poly'] 13param_grid = dict(gamma=gamma_values, C=C_values, kernel=kernels) 14 15#grid-search 16grid = GridSearchCV(estimator=model,param_grid=param_grid, 17 cv=5,scoring='accuracy',verbose=1) 18grid.fit(digits_X, digits_y) 19 20print("GridSearch took {} sec".format(time.time()-start))
1print("The best set of parameters is: ",grid.best_params_) 2print("The best score is: ",grid.best_score_) 3best_svm = grid.best_estimator_ 4print("The best model is saved in 'best_svm'")
1grid_results = pd.DataFrame(grid.cv_results_) 2# we can separate the values of parameters in 3# individual column from params dictionary as well. 4grid_results['C'] = [x['C'] for x in grid_results.params.values] 5grid_results['gamma'] = [x['gamma'] for x in grid_results.params.values] 6grid_results['kernel'] = [x['kernel'] for x in grid_results.params.values] 7grid_results['mean_score'] = grid_results['mean_test_score'] 8#There are several columns, we are just grabbing a few! 9print(grid_results[['C','gamma','kernel','mean_score']]\ 10 .sort_values('mean_score',ascending=False).head())