PythonStudy2

一、前言

接之前的分析, 先不考虑数据集中数据的选择问题. 先把数据集的数据量扩大, 暂时不考虑不同地区采集的数据的区别.

希望能够找到一些固有的联系吧.

二、流程展示

1. 获取所有文件

创建一个文件列表用于存储需要访问的文件的文件名. 需要注意的是只对以 ".xlsx" 的表格文件名进行存储.

先找到文件夹下所有文件和目录, 然后通过循环来判断是目录还是普通文件, 如果是目录就进行函数递归, 如果是文件就判断是否是表格文件, 若是就加入到文件名列表中. 具体代码如下所示.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os

files = []

def Getfile(path):
files_list = os.listdir(path)

for file_name in files_list:
file_absolute_path = os.path.join(path,file_name)
if os.path.isdir(file_absolute_path):
Getfile(file_absolute_path)
else:
if file_absolute_path.rsplit('.')[-1] == 'xlsx':
files.append(file_absolute_path)

Getfile(r"D:\Work\Data\welldata")

print(files)

运行截图

2. 训练

在之前代码的基础上进行修改, 因为在部分表中有一些数据缺失. 所以在这里对部分表进行处理, 缺失数据的表就不加入整体的数据集中.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pandas as pd

feature = []
label = []

for file in files:
useful_file = False

if pd.read_excel(file).shape[1] == 28:
useful_file = True
else:
useful_file = False

if useful_file:
# Get column 5,6,7,8,9,10,11,12,13,14,15,16,27 except head
data = pd.read_excel(file, usecols=[5,6,7,8,9,10,11,12,13,14,15,16,27],names=None)
df = data.values.tolist()

for i in range(len(df)):
feature.append(df[i][:-1])

if df[i][-1] == "差气层":
label.append(0)
elif df[i][-1] == "干层":
label.append(1)
elif df[i][-1] == "气层":
label.append(2)
else:
feature.pop()
else:
continue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.model_selection import train_test_split

feature_train_set,feature_test_set,label_train_set,label_test_set = train_test_split(feature,label)

print("label_train_set:")
print( label_train_set)

print("label_train_set size:")
print( len(label_train_set))

print("label_test_set:")
print( label_test_set)

print("label_test_set size:")
print( len(label_test_set))

运行截图

1
2
3
4
5
6
7
from sklearn.neighbors import KNeighborsClassifier

sklearn_knn_clf = KNeighborsClassifier(n_neighbors=3)

sklearn_knn_clf.fit(feature_train_set,label_train_set)

sklearn_knn_clf.score(feature_test_set,label_test_set)

运行截图

这里可以看见识别率在 70% 左右. 无论是切换距离度量还是计算算法, 分类识别率总是在 70% 附近波动.

更改训练集和测试集的比例也只能得到 70% 左右的正确分类率.

那么想要更高的识别率就应该考虑对数据的选择问题, 这就牵涉到对研究事物属性的了解.

三、总结

其实如果是以目的驱动, 倒可以分析一下不同类别数据的统计学属性, 然后归纳出一个合理选择数据的规则.

那么接下来的任务就是就是对数据进行分析, 然后再修改算法.