本文转自:http://blog.youkuaiyun.com/net_wolf_007/article/details/51794254
前面两章对数据进行了简单的特征提取及线性回归分析。识别率已经达到了85%, 完成了数字识别的第一步:数据探测。
这一章要做的就各种常用机器学习算法来对数据进行测试,并总结规律,为后续进一步提供准确率作准备。
这单选取的算法有:(后面有时间再对每个算法单独作分析总结介绍):
线性回归 支持向量机 决策树 朴素贝叶斯 KNN算法 逻辑回归
以测试样本的最后一千个数作为测试样例,其它的作为训练样例。 数据结果为测试样例的识别结果。
算法测试数据
对算法进行测试,测试数据如下:
测试算法 中文 precision recall f1-score 样本数 所花时间(秒) LinearRegression 线性回归 0.84 0.84 0.84 1000 2.402 SVC 支持向量机 0.85 0.85 0.85 1000 22.72 DecisionTree 决策树 0.81 0.81 0.81 1000 0.402 Bayes 朴素贝叶斯 0.78 0.77 0.77 1000 0.015 KNN KNN算法 0.86 0.86 0.86 1000 0.374 LogisticRegression 逻辑回归 0.82 0.82 0.82 1000 2.419
总结:
算法识别结果想差不多,除了贝叶斯之外都在80%以上。
时间花销上SVC算法花得最多。而贝叶斯花得最小。
在手写识别上,如果样本量够多,相比之下KNN算法会更确。
分析:
由于贝叶期是基于概率统计的算法。 计算时间会很快。而由于缺乏对特征之间的关心的支持,识别率会弱一些。
各数字识别统计
线性回归 支持向量机 决策树 基本贝叶斯算法 KNN算法 逻辑回归 数字 recall precision recall precision recall precision recall precision recall precision recall precision recall 平均 precision平均 0 0.93 0.83 0.93 0.88 0.92 0.9 0.92 0.88 0.95 0.87 0.95 0.89 0.933 0.875 1 0.96 0.91 0.97 0.97 0.96 0.96 0.97 0.84 0.99 0.98 0.94 0.94 0.965 0.933 2 0.82 0.82 0.84 0.76 0.8 0.74 0.59 0.73 0.81 0.81 0.73 0.76 0.765 0.770 3 0.79 0.72 0.75 0.74 0.71 0.74 0.71 0.61 0.81 0.71 0.73 0.67 0.750 0.698 4 0.68 0.87 0.73 0.84 0.7 0.77 0.64 0.83 0.75 0.85 0.68 0.78 0.697 0.823 5 0.73 0.78 0.75 0.8 0.66 0.73 0.67 0.63 0.78 0.84 0.8 0.8 0.732 0.763 6 0.93 0.93 0.92 0.88 0.89 0.88 0.91 0.84 0.92 0.91 0.89 0.91 0.910 0.892 7 0.89 0.83 0.88 0.85 0.78 0.72 0.74 0.78 0.87 0.88 0.86 0.82 0.837 0.813 8 0.83 0.83 0.83 0.85 0.78 0.79 0.82 0.77 0.81 0.9 0.83 0.8 0.817 0.823 9 0.82 0.86 0.82 0.85 0.86 0.83 0.72 0.8 0.84 0.81 0.79 0.8 0.808 0.825
数据总结:
整体数据中,1,6的识别率最高,而2, 3, 4, 5识别率最低。说明数据中比较难区分2, 3, 4, 5的属性。 注意线性回归中,0的recall 大于precision10个百分点,意味着把别的数据错误识别成0成的较多。 4中 recall小于precision 20%面分则说明识别4的特征不明显。
终合上面分析结果得到后续计划:
继续分析数据,寻找更有用的特征值。 使用KNN来作为数据分析算法。
测试代码
import numpy as np from sklearn.naive_bayes import GaussianNB from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.linear_model import LinearRegression from sklearn.svm import SVC import functools from datetime import datetime from time import clock from sklearn import metrics from tools import load_data, load_source, show_source def log_time(fn): @functools .wraps(fn) def wrapper(): start = clock() ret = fn() end = clock() print ( "{} use time: {:.3f} s" .format (fn.__name__, end-start)) return ret return wrapper data_x, data_y = load_data("train.txt" ) source_data = load_source("train.csv" ) print ( "len" , len(data_x), len(data_y)) LEN = -1000 x_train, y_train = data_x[:LEN], data_y[:LEN] x_test, y_test = data_x[LEN:], data_y[LEN:] @log_time def tran_LinearRegression(): RegressionDict = {} for i in range( 10 ): for j in range(i+ 1 , 10 ): regr = LinearRegression() RegressionDict["{}-{}" .format(i, j)] = regr x_train_tmp = np.array([x_train[index] for index, y in enumerate(y_train) if y in [i, j]]) y_train_tmp = np.array([0 if y == i else 1 for y in y_train if y in [i, j]]) regr.fit(x_train_tmp, y_train_tmp) ret_counter = [] for i in range(len(x_test)): ret_counter.append({}) tmp_dict = {} for key, regression in RegressionDict.items(): a, b = key.split('-' ) y_test_predict = regression.predict(x_test) tmp_dict[key] = [a if item <= 0.5 else b for item in y_test_predict] for i, item in enumerate(tmp_dict[key]): ret_counter[i][item] = ret_counter[i].get(item, 0 ) + 1 predict = [] for i, item in enumerate(y_test): predict.append(int(sorted(ret_counter[i].items(), key=lambda x:x[ 1 ],reverse= True )[ 0 ][ 0 ])) return predict print ( "\nLinearRegression" ) predicted = tran_LinearRegression() print (metrics.classification_report(y_test, predicted)) print ( "count:" , len(y_test), "ok:" , sum([ 1 for item in range(len(y_test)) if y_test[item]== predicted[item]])) map_predictor = { "LogisticRegression" :LogisticRegression(), "bayes" :GaussianNB(), "KNN" : KNeighborsClassifier(), "DecisionTree" :DecisionTreeClassifier(), "SVC" :SVC() } for key, model in map_predictor.items(): start = clock() print ( "start: " ,start, key, datetime.utcnow()) model.fit(x_train, y_train) end = clock() print ( "end: " ,end, key, datetime.utcnow()) print ( "{} use time: {:.3f} s" .format(key, end-start)) predicted = model.predict(x_test) print (metrics.classification_report(y_test, predicted)) print ( "count:" , len(y_test), "ok:" , sum([ 1 for item in range(len(y_test)) if y_test[item]== predicted[item]]))
输出结果