基于2017年亚太建模比赛A题数据的多种分类模型评价

该博客探讨了2017年亚太建模比赛中关于睡眠质量与多个指标关系的问题。通过数据预处理、异常值分析,采用多元线性模型、K-Means聚类和SPSS的神经网络、决策树方法进行建模。结果显示,多元线性模型的误差较小,K-Means聚类准确率为26%,而SPSS的神经网络和决策树模型分别达到了45.2%和45.1%的准确率。
摘要由CSDN通过智能技术生成

目录

问题重述

根据附件一中的数据分析给出的指标与睡眠质量的关系,如果一项或多项指标与睡眠质量没有相关性,则找出并删除。问题大意:建立一种模型,让你来分析以下各项指标对睡眠质量的影响。

附件一原始数据

Number 	Age 	Sex 	Source 	SQ 	Reliability 	Psychoticism 	Nervousness 	Character

0 1 28 1 Outpatient 1 36.62 15.00 63.91 50.34
1 2 65 0 Outpatient 2 57.24 44.20 61.17 37.70
2 3 63 0 Outpatient 1 48.45 40.99 41.73 35.35
3 4 30 0 Outpatient 3 52.42 40.48 67.90 28.41
4 5 67 0 Outpatient 1 54.31 37.79 52.53 42.39
… … … … … … … … … …
6344 6345 17 0 Outpatient 1 41.97 35.31 57.43 69.17
6345 6346 49 1 Outpatient 2 48.12 51.16 51.62 39.01
6346 6347 68 0 Outpatient 1 54.31 40.99 43.89 44.74
6347 6348 41 0 Outpatient 3 45.74 54.30 75.59 31.26
6348 6349 34 1 Outpatient 2 24.22 66.96 79.22 35.63

6349 rows × 9 columns

import pandas as pd #引入pandas 库
#读取数据集
data = pd.read_csv('Annex I.csv')#读取文件
data.describe()#运行结果如下

数据概要数据来源:2017亚太建模赛题A

1 数据预处理

原始附件一中性别为男女字符串格式,这里统一把男性定为1,女性定为0。 对于数据的预处理,首先剔除异常值。

异常值
指的是样本中的个别值,其数值明显偏离其余的数据。异常值通常也称为离群点,所以异常值分析也叫做离群点分析。

异常值分析通常有以下几种:

(1)简单统计量分析

最常用的统计量是最大值和最小值,用来判断这个变量的取值是否超出了合理的范围。

(2)3σ原则

如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。在正态分布的假设下,距离平均值3σ之外的值出现的概率为,属于极个别的小概率事件

(3)箱型图分析

箱型图提供了识别异常值的一个标准:(直接上图)
来自 海致警务大数据官方这里我使用箱图来剔除,代码如下:

import pandas as pd
import matplotlib.pyplot as plt
# 读取附件一数据集

data = pd.read_csv('Annex I.csv')
plt.figure(figsize=(10,8))

# 设置图形的显示风格
plt.style.use('ggplot')
# 设置中文和负号正常显示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 绘图:附件一箱线图
plt.boxplot(x = data.Reliability, # 指定绘图数据
            patch_artist  = True, # 要求用自定义颜色填充盒形图,默认白色填充
            showmeans = True, # 以点的形式显示均值
            widths = 0.2,
            boxprops = {'color':'black','facecolor':'#9999ff'}, # 设置箱体属性,填充色和边框色
            flierprops = {'marker':'o','markerfacecolor':'red','color':'black'}, # 设置异常值属性,点的形状、填充色和边框色
            meanprops = {'marker':'D','markerfacecolor':'indianred'}, # 设置均值点的属性,点的形状、填充色
            medianprops = {'linestyle':'--','color':'orange'}) # 设置中位数线的属性,线的类型和颜色
# 设置y轴的范围
plt.ylim(0,100)
# 显示图形
plt.show()

在这里插入图片描述

2 问题分析

1.多元线性拟合
问题一可以理解为一个多元的线性拟合问题,y为睡眠质量SQ,X分别为各类影响因素,即:Y = SQ ,X1 = Reliability ,X2 = Psychoticism ,X3 = Nervousness ,X4 = Character。其表达式为:Y = aX1+bx2+cX3+dX4+e,其中abcd为要求的权重值,e为偏置。问题便转化为求abcde的值。求得各参数值后,由于我们所要求的Y值只有0,1,2,3,然而通过多元线性拟合后得到Y值需要通过四舍五入处理成0,1,2,3整数。最后评判模型预测的准确性。

2.分类聚类问题
问题一也可以理解为一个分类问题,SQ按照0,1,2,3分为四类,本文将运用多种聚类方法,通过比较各个模型的正确率来确定最优结果。

3 多元线性模型的实现

直接上代码:
1.导入相关数据库

#倒入数据库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

2.读取数据集和预处理

data = pd.read_csv('Annex I.csv')#读取
#为X赋值
x = data[[ 'Age','Reliability','Psychoticism','Nervousness','Character']]
#为Y赋值
y = data.SQ

3.模型的初始化

model = LinearRegression()

4.调用模型进行拟合

model.fit(x,y)

5.看一下结果

for i in zip(x.columns,model.coef_):
    print(i)

结果:
(‘Age’, 0.008485289749629348)
(‘Reliability’, 0.0007205693003604623)
(‘Psychoticism’, 0.002565646794456601)
(‘Nervousness’, 0.007624798629370403)
(‘Character’, -0.0016430414645269718)
6.计算误差

mean_squared_error(model.predict(x),y)
OUT:0.6594778436461478#越小越好

4 K-MEANS 聚类(无监督聚类)

K-Means模型概要:在运用模型前确定常数K,常数K意味着最终的聚类类别数,在本数据中,我们已经知道了睡眠质量SQ可分为0,1,2,3四类。模型首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,直到质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

上代码:

#导入函数库
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics

#读取数据及
data = pd.read_csv('Annex I.csv')
#开始利用模型进行预测
#考虑四种影响因素,n_clusters=4 分四类
y_pred = KMeans(n_clusters=4).fit_predict(data[['Age', 'Sex','Reliability','Psychoticism',
       'Nervousness', 'Character']])
       
SQ_pre = pd.Series(y_pred)#把预测值添加上索引
#把预测值和真实结果放入一个列表
data_p = pd.DataFrame({'y_pre':SQ_pre ,'y':data.SQ})

#增加一列 判断预测和真实值是否想等,返回布尔值
data_p['acc'] = data_p.y_pre == data_p.y
ACC = data_p.acc.sum()/len(data_p)#计算正确率

print('分类准确率:', ACC)
分类准确率: 0.26019845644983464

5.利用SPSS 神经网络预测分类

1.读取数据

在这里插入图片描述2.开始建立神经网络模型

在这里插入图片描述3.分析-神经网络-多层感知器

在这里插入图片描述4.设置输出

在这里插入图片描述5.查看结果

在这里插入图片描述

在这里插入图片描述

6.利用SPSS 决策树聚类

1.分析-分类-决策树
在这里插入图片描述2.结果输出
在这里插入图片描述
在这里插入图片描述

总结一下

各模型的准确率:

模型准确率
多元线性拟合34&
K-Means26%
SPSS 多层感知器45.2%
SPSS 决策树45.1%

刚刚入门,有错误希望指出,后续会更新其他算法。
By dc mzx

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值