PythonStudy6

一、数据处理

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

发现 PERM 属性出现下图分布

1
2
3
4
5
6
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)

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

同理对剩余属性进行处理

1
2
3
4
5
6
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)

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

1
2
3
4
5
6
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)

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

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

二、算法测试

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

1
2
3
4
5
6
7
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
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))

运行截图

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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)

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

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

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

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

1
2
3
4
5
import numpy as np

for i in range(3):
print('label = ',i)
print(np.sum(label==i))

运行截图

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

三、总结

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

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