天天看點

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

基于2017年亞太模組化比賽A題資料的多種分類模型評價

  • 目錄
    • 問題重述
    • 附件一原始資料
    • 1 資料預處理
    • 2 問題分析
    • 3 多元線性模型的實作
    • 4 K-MEANS 聚類(無監督聚類)
    • 5.利用SPSS 神經網絡預測分類
    • 6.利用SPSS 決策樹聚類
    • 總結一下

目錄

問題重述

根據附件一中的資料分析給出的名額與睡眠品質的關系,如果一項或多項名額與睡眠品質沒有相關性,則找出并删除。問題大意:建立一種模型,讓你來分析以下各項名額對睡眠品質的影響。

附件一原始資料

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題資料的多種分類模型評價目錄

資料來源:2017亞太模組化賽題A

1 資料預處理

原始附件一中性别為男女字元串格式,這裡統一把男性定為1,女性定為0。 對于資料的預處理,首先剔除異常值。

異常值

指的是樣本中的個别值,其數值明顯偏離其餘的資料。異常值通常也稱為離群點,是以異常值分析也叫做離群點分析。

異常值分析通常有以下幾種:

(1)簡單統計量分析

最常用的統計量是最大值和最小值,用來判斷這個變量的取值是否超出了合理的範圍。

(2)3σ原則

如果資料服從正态分布,在3σ原則下,異常值被定義為一組測定值中與平均值的偏差超過3倍标準差的值。在正态分布的假設下,距離平均值3σ之外的值出現的機率為,屬于極個别的小機率事件

(3)箱型圖分析

箱型圖提供了識别異常值的一個标準:(直接上圖)

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

這裡我使用箱圖來剔除,代碼如下:

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()
           
基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

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.模型的初始化

4.調用模型進行拟合

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.讀取資料

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

2.開始建立神經網絡模型

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

3.分析-神經網絡-多層感覺器

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

4.設定輸出

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

5.檢視結果

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄
基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

6.利用SPSS 決策樹聚類

1.分析-分類-決策樹

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

2.結果輸出

基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄
基于2017年亞太模組化比賽A題資料的多種分類模型評價目錄

總結一下

各模型的準确率:

模型 準确率
多元線性拟合 34&
K-Means 26%
SPSS 多層感覺器 45.2%
SPSS 決策樹 45.1%

剛剛入門,有錯誤希望指出,後續會更新其他算法。

By dc mzx