• PythonStudy6


    一、数据处理

    继之前的任务, 这里通过用图表的形式判断并将各个属性的离群点舍去.

    发现 PERM 属性出现下图分布

    del_index = []
    for col in range(len(data_test[2])):
        if data_test[2][col] > 2.5:
            del_index.append(col)
    data_test = np.delete(data_test, del_index, axis = 1)
    label = np.delete(label, del_index)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对于 PERM 属性舍去大于 2.5 的样本

    同理对剩余属性进行处理

    del_index = []
    for col in range(len(data_test[8])):
        if data_test[8][col] > 200:
            del_index.append(col)
    data_test = np.delete(data_test, del_index, axis = 1)
    label = np.delete(label, del_index)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对于 RT 属性舍去大于 200 的样本

    del_index = []
    for col in range(len(data_test[10])):
        if data_test[10][col] > 20:
            del_index.append(col)
    data_test = np.delete(data_test, del_index, axis = 1)
    label = np.delete(label, del_index)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对于 C2 属性舍去大于 20 的样本

    以此类推对所有属性进行处理. 但是我在这里有个想法, 为什么不对每类的属性进行处理呢?看起来有点故意为之的感觉, 实在不行再考虑这样处理吧.

    二、算法测试

    在使用一般的分类算法之前, 这里了解到还可以通过随机森林算法进行分类.

    from sklearn.ensemble import RandomForestClassifier
    
    sklearn_rf_clf = RandomForestClassifier()
    
    sklearn_rf_clf.fit(feature_train_set,label_train_set)
    
    sklearn_rf_clf.score(feature_test_set,label_test_set)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行截图

    随机森林进行交叉验证

    from sklearn.model_selection import cross_val_score
    
    score = cross_val_score(sklearn_rf_clf,feature_train_set, label_train_set, cv=3,n_jobs=1)
    print("CV accuacy score:%s" % score)
    print("CV accuacy mean score:%.3f" % np.mean(score))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行截图

    这里可以看见识别率比之前使用过的算法有所提升.

    但是数据处理之后对识别率提升没有很明显变化, 以 100 次 KNN 平均识别率为例.

    from sklearn.neighbors import KNeighborsClassifier
    
    sklearn_knn_clf = KNeighborsClassifier(n_neighbors=7)
    
    sklearn_knn_clf.fit(feature_train_set,label_train_set)
    
    score = 0
    
    for i in range(100):
        score += sklearn_knn_clf.score(feature_test_set,label_test_set)
    
    print(score/100)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    数据处理前进行 100 次 KNN 的平均识别率

    数据处理后进行 100 次 KNN 的平均识别率

    很奇怪的是, 处理数据后识别率反而下降了. 看来相比起处理数据, 算法才是主导. 或许也只是自己的数据处理有问题.

    看一下样本不同分类的个数, 观察是不是出现了分布不均.

    import numpy as np
    
    for i in range(3):
    	print('label = ',i)
    	print(np.sum(label==i))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行截图

    看样子没有分布不均. 但是相比那些数据集, 这个数据集的大小就小得多了. 是否可以考虑对训练集和测试集的划分进行修改?这点不用担心, 库中的函数考虑到了这个问题, 它是分别对每类用固定比例进行划分.

    三、总结

    只剩下神经网络没有使用, 或者还有其他的算法. 还是更想对数据分析更透彻一些. 为了结果而做一些工作虽然看起来很不错, 但自己总感觉是 “为赋新词强说愁”.

    看一些博客了解到相关性这个东西, 说不定会对分类有所效果.

  • 相关阅读:
    [MIT 6.830 SimpleDB] Lab1 Exercise 1-3
    国产瑞芯微RK3399 硬件设计之 HDMI2.0 的注意事项
    野心勃勃的日本第五代计算机,是如何一步步走向失败的
    HTTPS报文分析(Wireshark)
    运维如何学习、自我提升价值?
    揭示预处理中的秘密!(二)
    解密JavaScript的异步机制:打破单线程限制,提升性能与用户体验
    使用 KubeSkoop exporter 监测和定位容器网络抖动问题
    pyqt5 学习笔记六(QFormLayout)表单布局器
    gRPC gateway - Http Restful API & gRPC 协议转换
  • 原文地址:https://blog.csdn.net/qq_44309220/article/details/126143821