测试sklearn包中常用的机器学习算法

来源:互联网 发布:gcr.io 阿里云 编辑:程序博客网 时间:2024/06/13 17:35

# 测试sklearn包中常用的几种机器学习算法,loadExcel()是我自己封装的

# 如果某些方法名想不起,要善于利用IDE的自动补全功能
# excel的最后一列是分类标签,用的是0,1整数,是否能用字符串还未测试
# 统计每类标签有多少个样本用了filter函数

# 本程序中使用的数据集只有两分类0 1,数据集的格式完全一样,如下所示。

# anaconda已经集成了sklearn包,也集成了读写excel包,不需要pip安装

# -*- coding: utf-8 -*-from sklearn import metricsfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import treefrom sklearn.svm import SVCfrom sklearn.ensemble import AdaBoostClassifier             # 提升决策桩from sklearn.ensemble import RandomForestClassifier         # 随机森林from sklearn.ensemble import GradientBoostingClassifier     # GBDT(Gradient Boosting Decision Tree) Classifier 梯度提升决策树from numpy import *import randomimport timeimport xlrdimport xlwt# 读excel,返回一个二维数组,包括属性和类别def loadExcel(fname):    bk = xlrd.open_workbook(fname)    sh = bk.sheet_by_name("Sheet1")    nrows = sh.nrows   # 获取行数    ncols = sh.ncols   # 获取列数    # 将第0行属性名存入列表    attrList = []    for col in range(0, ncols):                 # 列循环从0到ncols-1        attrList.append(sh.cell_value(0, col))    # print attrList    # 从第一行开始获取数据 5分类    row_list = []    labelKind = []    for i in range(1, nrows):        row_data = sh.row_values(i)        row_list.append(row_data)                   # 向list中添加list        # if(row_data[-1]=='fault5'):               # 如果excel中类别标签是字符串,用这种方式转成整型        #     row_data[-1] = 1        # labelKind.append(row_data[-1])    # labelKind = set(labelKind)                    # 将labelKind转成set再求大小,即可知道数据集中有多少分类    # print labelKind.__len__()    return array(row_list)# SVM Classifier using cross validation 交叉验证支持向量机# 因为这个涉及网格搜索最佳参数,所以封装起来了def svm_cross_validation(train_x, train_y):    from sklearn.grid_search import GridSearchCV    from sklearn.svm import SVC    model = SVC(kernel='rbf', probability=True)    param_grid = {'C': [1e-3, 1e-2, 1e-1, 1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}    grid_search = GridSearchCV(model, param_grid, n_jobs = 1, verbose=1)    grid_search.fit(train_x, train_y)    best_parameters = grid_search.best_estimator_.get_params()    for para, val in best_parameters.items():        print para, val    model = SVC(kernel='rbf', C=best_parameters['C'], gamma=best_parameters['gamma'], probability=True)    model.fit(train_x, train_y)    return model    # 主函数if __name__ == '__main__':    # 调用scikit中的分类器,datingDataMat可以是ndarray或者matrix,datingLabels必须是list    trainData = loadExcel('train.xlsx')    testData = loadExcel('test.xlsx')    rows_train, features_train = shape(trainData)    rows_test, features_test = shape(testData)    print u'训练集样本数:%d' % rows_train    print u'测试集样本数:%d' % rows_test    print (u'特征维数:%d' % (features_train-1))           # 将最后一列抽出来转成set,便可得到分类数    # 将训练集和测试集的属性向量和类别向量分开    train_attr = trainData[:, 0:features_train-1]                    # 训练集的属性矩阵,numpy.ndarray    train_label = trainData[:, -1]                                    # 类别向量,numpy.ndarray    test_attr = testData[:, 0:features_train-1]    test_label = testData[:, -1]    # 训练模型:设置模型参数    # model = KNeighborsClassifier()                                          # KNN    # model = tree.DecisionTreeClassifier()                                   # 决策树    # model = SVC(kernel='rbf', C=1000, gamma=0.001, probability=True)        # 支持向量机    # model = GradientBoostingClassifier(n_estimators=200)                    # 梯度提升决策树    # model = RandomForestClassifier(n_estimators=8)                          # 随机森林    model = AdaBoostClassifier(n_estimators=100)                            # 提升决策桩    # model = svm_cross_validation()                                          # 交叉验证支持向量机    # 用训练集开始训练模型    model.fit(train_attr, train_label)    # 预测结果(硬输出),预测结果list    predict = model.predict(test_attr)    faultname=['变频器超速','变频器未就绪','变频器脱网','电网频率过高','正常']      # 这个没用到    for i in range(rows_test):        # time.sleep(0.5)        if test_label[i] == predict[i]:             print(u'当前数据的实际分类标签是:%s ,模型的预测输出类别是:%s ,预测分类与实际分类是否相符:true'  %(test_label[i], predict[i]))        else:            print(u'当前数据的实际分类标签是:%d ,模型的预测输出类别是:%d ,预测分类与实际分类是否相符:false*******'  %(test_label[i], predict[i]))    # 准确率    accuracy = metrics.accuracy_score(test_label, predict)    print u'model的分类准确率为:%f' % (accuracy)    # 召回率    recall = metrics.recall_score(test_label, predict)    print 'precision: %.2f%%, recall: %.2f%%' % (100 * accuracy, 100 * recall)    # 测试集中各类别的样本数filter    list1 = filter(lambda x: x == 1, test_label)    label1_num = list1.__len__()    print u"测试集中第一类样本的个数为:%d" %label1_num    # print u"model1混淆矩阵如下:"                                    # 混淆矩阵的计算以后再讨论    # print confusionMatrix    # print u'模型1对第一类分类正确的比例为%f' % label1_precison      # 根据混淆矩阵做计算


原创粉丝点击