实验目的和要求:
分类问题是数据分析和挖掘的经典问题,用于预测数据对象的离散、无序的类别。分类算法反应的是如何找出同类事务的共同性质的特征型知识和不用事物之间的差异性特征知识。分类通过有指导的学习训练建立分类模型,并使用模型对未知分类的实例进行分类。通过python 语言实现对二分类问题的解决,掌握数据挖掘的过程和思路。代码链接:https://github.com/ZLT0309/Tensorflow_Binary-classification
博客地址: https://www.iamzlt.com/?p=157
实验内容:
1. 数据集创建三个文件格式相同,共四栏数据,前三栏为人的三个特征值,身高(cm)、体重(500g)、脚长(cm),最后一栏为标签为男(1)、女(0)。Person_1801.xls 和 Person_1802.xls 为训练集,负责模型的构建;Person_test.xls 中包含有80 人的三个特征值和真实标签,为测试集,负责模型的验证
数据集:
测试集:
2.模型构建
- 首先基于训练集构建一个二分类的模型,实现以三个特征值为输入,输出 0 or 1 完成男女性别的判断;
- 然后基于测试集对构建的模型,进行测试,并基于真实标签得到判别结果是否准确;
- 运行10 次,打印输出每次的错误率,以及平均错误率、判别错误样本 和对应的总错误次数。
代码如下:
运行结果:
3.模型测试和优化
3.1 模型准确率
方法二:全连接网络,运行代码:
![](https://www.iamzlt.com/wp-content/uploads/2020/04/5-300x245.png)
运行结果:
3.2 归一化对模型的影响
下面是数据没有进行归一化的结果。
![](https://www.iamzlt.com/wp-content/uploads/2020/04/7-298x300.png)
与归一化后的结果相比较,可以看出归一化可以提高模型的收敛速度和精度。
3.3 模型可扩展性
将一个班的数据分别为训练集进行训练,可以看到结果如下,相较于两个班的数据为训练集的情况,准确率明显下降。
3.4 数据清洗对模型的影响
数据清洗(Data cleaning)– 对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在的错误,并提供数据一致性。
- 处理重复值与空缺值:
df1 = pd.read_excel('Person_1801.xls').dropna(axis = 0);
df2 = pd.read_excel('Person_1802.xls').dropna(axis = 0);
df=pd.concat([df1,df2])
df=df.drop_duplicates(subset=["身高(cm)","体重(500g)","脚长(cm)"],keep='first')
- 处理噪声值:
红色为离散点
![](https://www.iamzlt.com/wp-content/uploads/2020/04/10.png)
K-means算法如下:
k = 2
threshold = 2
iteration = 500
data=df
data = data.iloc[:, 0:-1]
data_zs = 1.0*(data - data.mean())/data.std()
from sklearn.cluster import KMeans
model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration)
model.fit(data_zs)
r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis = 1)
r.columns = list(data.columns) + [u'聚类类别']
norm = []
for i in range(k):
norm_tmp = r[["身高(cm)", "体重(500g)", "脚长(cm)"]][r[u'聚类类别'] == i]-model.cluster_centers_[i]
norm_tmp = norm_tmp.apply(np.linalg.norm, axis = 1)
norm.append(norm_tmp/norm_tmp.median())
norm = pd.concat(norm)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
norm[norm <= threshold].plot(style = 'go')
discrete_points = norm[norm > threshold]
discrete_points.plot(style = 'ro')
plt.xlabel(u'编号')
plt.ylabel(u'相对距离')
plt.show()
#print(norm)
#norm.to_csv('norm.csv',header=False,index=False,encoding='UTF-8')
index_=0
df=df.reset_index(drop=True)
data=df
for i in norm:
if i>threshold:
print(data.iloc[index_])
df=df.drop(index_)
index_+=1
数据清洗后的运行结果:
![](https://www.iamzlt.com/wp-content/uploads/2020/04/11-300x271.png)