Tensorflow男女二分类问题的实现

实验目的和要求:

分类问题是数据分析和挖掘的经典问题,用于预测数据对象的离散、无序的类别。分类算法反应的是如何找出同类事务的共同性质的特征型知识和不用事物之间的差异性特征知识。分类通过有指导的学习训练建立分类模型,并使用模型对未知分类的实例进行分类。通过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 次,打印输出每次的错误率,以及平均错误率、判别错误样本 和对应的总错误次数。
方法一:KNN运行代码:

代码如下:

运行结果:

3.模型测试和优化

3.1 模型准确率

方法二:全连接网络,运行代码:

运行结果:

3.2 归一化对模型的影响

下面是数据没有进行归一化的结果。

与归一化后的结果相比较,可以看出归一化可以提高模型的收敛速度和精度。

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')
  • 处理噪声值:
使用K-means算法,将离散点阈值设置为2,获得离散点(如下图),并将离散点去除。

红色为离散点

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

数据清洗后的运行结果:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值