日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据分析初探——以2020百度西安交大大数据竞赛:传染病感染人数预测为例

發布時間:2024/1/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据分析初探——以2020百度西安交大大数据竞赛:传染病感染人数预测为例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 數據分析初探——以2020百度&西安交大大數據競賽:傳染病感染人數預測為例
    • 比賽的大致情況
    • 環境配置與相關包的配置
      • anaconda和pytorch(順帶tensorflow)的配置
      • GPU的配置
      • 寫這個Notebook的配置
    • 數據處理
      • 一些數據處理軟件的選擇
      • 這次比賽的數據處理
        • 比賽提供的數據格式
        • 數據處理的主要步驟
        • stata,SPSS數據處理的一些方法
        • python pandas包的使用
        • numpy 包操作array
        • csv文件讀寫有關問題
        • python 程序編寫中發現的問題和tricks
        • 簡單可視化
        • 數據編碼與轉換
          • (1)熱編碼
          • (2)時間序列處理
          • (3)空間編碼
    • 機器學習和神經網絡的初步了解
      • sklearn包
        • KNN和SVM
        • 訓練集劃分和參數訓練
      • XGBoost
      • LSTM
        • 神經網絡是怎樣做預測的
      • CNN

數據分析初探——以2020百度&西安交大大數據競賽:傳染病感染人數預測為例

?emm第一次參加這種比賽試水,雖然初賽的具體情況沒有公布,但是感覺已經翻車了ORZ(端午節最后一天沖榜的都太猛了嚶)。已經有將近一年沒怎么寫程序了,感覺在重新學習python,作為一只菜狗還在ctrlC ctrlZ之間游走,雖然如此本菜在大佬的幫助下還是學習到了很多的知識。想做一個總結&對學到的ML,數據分析,數據挖掘知識進行梳理&練習markdown的書寫&整理之前收藏的亂糟糟的鏈接(這次的文本是用jupter notebook寫的,jupyter屬實好用:3 !)比賽相關程序是用python寫的,但是下面的內容不僅限于此次比賽與python,但可能舉例多舉此次比賽的例子。python和juyter相關下載配置部署詳見后面有關部分。

比賽的大致情況

? 這次比賽比賽流程和一般的數據分析比賽的流程差不多,可能多了一個時間有點長(將近2個月)的初賽,復賽是一個月時間,決賽取復賽前一定名次做答辯。每天限制提交2次預測結果,計算誤差進行排名,取排名靠前者。報名已經截至了,具體的情況見官網
? 比賽的目標是用給出前45天5個城市的相關數據(包括感染人數,人流量密度,城市間人口流動量,城市內人口流動量,溫度,濕度,風力,風向等)來預測往后30天5個城市,總計392個地區每日的的新增感染人數。
?官網給了baseline但是是用的paddel的架構,而且效果不太好…

環境配置與相關包的配置

本來這個比賽的目的之一是推廣百度自己的paddlepaddle的框架,但是這個不太常用,而且很多API不知道是啥,然后就沒用這個。

anaconda和pytorch(順帶tensorflow)的配置

Anaconda是Python的一個開源發行版本,pytorch/tensorflow是神經網絡常用的框架,這個上面有安裝配置方式 我在安裝時沒按照這個來,但是一般來說anaconda的安裝都是很簡單的而且一般下載完后會自動配置環境變量,上網查到的方法也一般都能用(不管安裝什么,都比較建議在CSDN等網站找一篇比較detailed,贊比較多,評論大多數都是感謝貼主的安裝指南照著安裝),安裝完anaconda之后在anaconda navigator里或者prompt里安裝pytorch,tensorflow,sklearn,numpy,pandas包都很容易。

需要注意:
1.如果你在使用SSR或者VPN科學地上網,可能會出現占用jupyter notebook打開的端口,把SSR關掉就能打開jupyter notebook了。
2.在安裝pytorch/tensorflow的時候建議不要在prompt里面使用conda install下載,這樣下載的是pytorch和tensorflow的CPU版本,對應的GPU版本下載在后續進行說明。

GPU的配置

配這個是真的麻煩啊啊啊啊,當時搞了好多天。一般電腦里用NVIDIA的顯卡可以按照下面的步驟,(原來把詳細是步驟放在了收藏夾,后來發現在收藏夾里蒸發了???但是大致步驟如下,大家可以在網上找比較靠譜的教程(有的官方文檔提供的安裝教程不太好用)然后考慮下面的tips安裝)
1.cuda和cudnn的配置(參考網上的一些教程,官網上可以直接下載,但是要選擇對版本,而且要在nvidia官網里注冊)
2.gpu版本pytorch和tensorflow的下載(參考網上的教程/在navigator里可以下gpu版本)
3.pycuda可以試著用gpu跑普通的程序(還沒有嘗試,似乎效率不太高)

tips:
1.安裝中最容易出問題的是版本不兼容,需要注意python的版本,cuda的版本,顯卡的版本,和下載的pytorch/tensorflow的版本,一般來說都是不同版本向下兼容,向上不兼容的,具體的情況可以參考網上的安裝說明/另一種方法是安裝后對版本升級(升級python &&升級顯卡 比如我的電腦用的GeForce的顯卡,就安裝了GeForce Experience自動升級)
2.tensorflow安裝后使用時如果有no module named "tensorflow"的報錯可能是因為安裝路徑不對,改這個很麻煩,建議卸載重下。
3.能使用tensorflow/pytorch之后可能會有報錯“ailed to get convolution algorithm. This is probably because cuDNN failed to…”類似的報錯,可能是因為顯存不夠,建議關閉之前的運行的網絡/增加顯存/簡化網絡…

寫這個Notebook的配置

這個文檔書寫用到的是jupyter notebook,編輯目錄等需要下載擴展文件nbextension具體下載方法,目錄怎么搞
ps.jupyter notebook運行完一個文件后,在首頁點前面的方塊shutdowm以免占內存

數據處理

一些數據處理軟件的選擇

?數據處理方法和相關軟件有很多種,并不是越復雜越高端越好,需要根據實際情況進行選擇。Excel一般情況下都是超好用的!
?在先前發的文章中有提到過SPSS,stata(雖然只是吐槽一下)在這個的最后面,還有SAS啥的對于一般的數據處理,簡單的數據分析(計量上的面板數據多元logit,probit回歸)都可以handle,而且用stata,spss之類有數據顯示頁面,能直接看著整個數據操作,而且很好學,而且很多都和excel一樣能直接按button操作,python和matlab需要寫和csv,excel的接口,暫時不能看到完整的數據狀態,如果寫相關程序不熟練會耗費更多的精力或者感覺很煩躁。
?R沒學過,但是聽說相關的時序處理的包比較多但是處理的數據量不如python,而且比python慢。And,SQL,去年暑假計劃好要學SQL的,但是最后竟然下了好多次沒有下下來就鴿了(可能現在科學上個網在官網下會比較快,或者找國內的鏡像)。
?然后就是這次比賽主要使用的python的pandas包,開始還覺得pandas不好用。。。后來我就真香了!pandas真香!

這次比賽的數據處理

比賽提供的數據格式

?把比賽用的數據包下載之后整理了一下各個包里的數據格式,提供的數據沒有做train-data和test_data的劃分,數據的內容主要是下面幾種:

density: 數據完整 時間(按小時) 地點(經緯度) 人口流動量
infection:數據完整 時間(按天) 地點(按區域(兩個變量:城市&區域)) 新增感染
weather: 有缺失 時間(按小時) 地點(按城市) 溫度、濕度(有百分比)、風向:九個方向(加上無風)
???? 風速(<12km/h,16-24km/h,24-34km/h,三檔&空白(包括無風和缺失值))
???? 風力(0,1,2,3,4,??,無缺失值)
???? 天氣(cloudy moderaterain rain overcast sunny fog lightrain) ????
p.s.風力和天氣無缺失值
migration:數據完整 時間(按天) 地點:出發——到達(城市) 城市間遷徙指數
transfer :數據完整 時間(日均小時)地點 :(城市內:出發經緯度,到達經緯度) 城市中遷移強度
grid_attr: 數據完整 地點:經緯度 屬于該城市的哪個區域

數據處理的主要步驟

下面主要是在這次比賽中用到的,更系統一點的方法看這里
1.觀察數據格式類型,了解數據內涵。
2.可視化。
?(1)看基本走勢,(這個很重要,我們第一次提交就是直接根據infection的走勢擬合了一個函數直接預測,有人擬合的好就直接進復賽遼)
?(2)數據之間的關系
?(3)數據情況(描述性統計)(噪聲大的考慮分箱等方法降噪,噪聲特別大的舍棄這個特征)。
3.缺失值處理。
?(1)直接刪除一些具體的做法
?(2)pandas fillina函數的使用具體看這里
?(3)用KNN或者決策樹等方法填充
5.異常值處理。
?這次沒怎么用…主要數據實在(全是噪聲ORZ)
4.數據格式轉換。
?(1)數據的編碼與轉換,詳細見后面的部分。
?(2)數據格式轉換,主要做CNN等神經網絡的時候的輸入格式的調整。

stata,SPSS數據處理的一些方法

這些功能都能在pandas中實現

?混著用軟件做數據處理屬實弟弟行為,但是當時太菜了就沒想太多ORZ,還是應該學好一樣來做處理(首推pandas!)
?因為開始的時候還不太會用pandas就想用其他的軟件。開始使用SPSS,但是SPSS沒有批量處理多個文件的能力,且無法提取符號和數字混合的變量(例如帶%¥)
于是又用了stata,stata在查看數據窗口可以完成字符型變量與數值變量的轉換,最妙的是
即使你不知道對應程序怎么寫,在窗口上點按鈕操作后會自動出現相應的代碼,另外stata
支持正則表達式的提取,詳見

1.數據類型的轉換
聲明數值變量的方法:gen variable=.
字符到數值的轉換:
?? gen v5_change=.
?? replace v5_change=0 if v5==“Quiet”
?? replace v5_change=1if v5==“East”
在例如logit回歸(附一個logistic回歸結果回歸系數&OR值解讀and SPSS二項logistic回歸的方法和解釋)中需要將分類變量轉化為啞變量,避免將分類元的數值作為倍數關系處理。(例如在分類變量:性別中,將男變為0,女變為1)。在python 的pandas庫中有更好的處理方法在后面會提到。

2.缺失值處理
?關于缺失值,實際上SPSS提供了取總體平均值,中位數,以及缺失值前后非缺失值平均數,中位數,線性估計。但是如果變量是int型,SPSS處理后會變成float。然后有人告訴我了一個神奇偏方(PS:此方法僅供娛樂):先按照上述方法補全缺失值再取整,SPSS中取整數參考(SPSS中:轉換->計算變量->函數組->字符串->Char.substr())(取整方法:或者調整SPSS總體數據格式)

python pandas包的使用

pandas包除了在數據處理上有很多好用的函數外,值得一提的還有Pandas的數據存儲方式 ,相較于使用列表\字典的嵌套更節省空間。

?一般來說pandas包和numpy包是配合使用的。官方文檔關于pandas包的學習強列推薦:這個里面有教程和習題,同樣也可以當成工具書使用。
?下面是一些寫程序過程中常用的points,寫在這里方便以后copy:

(1)讀取csv文件加表頭(不要學我這樣的菜狗路徑帶中文):

import pandas as pd name=['date','hour','grid','infect','density','w_temp','w_humid','w_toward','w_speed','w_force','w_w','trans_1','trans_2'] data=pd.read_csv(r"C:\Users\10539\Desktop\數據競賽\數據整理\except_migration.csv",header=None,names=name)#none表示原文件沒有表頭,header=i表示從第i+1行開始 data.head()#看前5排(加表頭) datehourgridinfectdensityw_tempw_humidw_towardw_speedw_forcew_wtrans_1trans_201234
0000.0951.8167601138.27.8
0010.0987.21676011317.914.1
0020.0665.5167601138.78.9
0030.0818.0167601135.77.9
0040.01797.91676011312.615.6

(2)選幾排:

a=data[['date','hour']] a.head() datehour01234
00
00
00
00
00

(3)索引:

#方法1:loc 得到series或者dataframe b=data.loc[3,['date']] b date 0.0 Name: 3, dtype: float64 #方法2:[] 兩種方法最后得到的值的形式不同 data['hour'][400]#先列后行 1

(4)取值(數據類型不發生改變):

a=data[['date','hour']].values a array([[ 0, 0],[ 0, 0],[ 0, 0],...,[44, 23],[44, 23],[44, 23]], dtype=int64) a=data.loc[:,['date','hour']].values a array([[ 0, 0],[ 0, 0],[ 0, 0],...,[44, 23],[44, 23],[44, 23]], dtype=int64) a=data.loc[:,'date'].values#注意pandas中[]作為索引和表示列表的雙重作用 a array([ 0, 0, 0, ..., 44, 44, 44], dtype=int64)

(5)變量變換,以標準化為例(注意其中lambda函數的使用):

data[['density','w_temp','w_humid','trans_1','trans_2']]=data[['density','w_temp','w_humid','trans_1','trans_2']].transform(lambda x:(x-x.mean())/x.std())

(6)去掉行/列

data=data.drop(['w_humid','w_toward','w_force'],axis=1) data.tail()#看后5排 datehourgridinfectdensityw_tempw_speedw_wtrans_1trans_2423355423356423357423358423359
44233876.375000143.47110.50.8
442338841.08333399.07110.80.9
442338925.3750000.27110.00.0
442339029.000000121.37111.01.8
44233914.125000157.77111.11.7

(7)增加列:

trans_1=list(range(423360)) data['trans_1']=trans_1#trans data.head() datehourgridinfectdensityw_tempw_speedw_wtrans_1trans_201234
0000.0951.8161307.8
0010.0987.21613114.1
0020.0665.5161328.9
0030.0818.0161337.9
0040.01797.91613415.6

(8)改變行/列名:

#用字典的形式,不改變存儲 data=data.rename(columns={'trans_1':1}) data.head() datehourgridinfectdensityw_tempw_speedw_w1trans_201234
0000.0951.8161307.8
0010.0987.21613114.1
0020.0665.5161328.9
0030.0818.0161337.9
0040.01797.91613415.6

(9)按條件索引:

wa=data.loc[lambda x :x['grid']==0] wa.head()#注意新的dataframe每行的index保持原狀 datehourgridinfectdensityw_tempw_speedw_w1trans_2039278411761568
0000.0951.8161307.8
0100.0951.815133928.4
0200.0951.814127847.7
0300.0951.8141211765.5
0400.0951.81403156812.2

(10)按行、列遍歷:詳見

(11)分類函數groupby

#這個函數是真的好用 grid_pre=data.groupby('grid') grid_pre#把data按照相同的grid進行劃分 <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000020A6F9DC608> x=grid_pre.get_group(200)#取grid=200的分組 x datehourgridinfectdensityw_tempw_humidw_towardw_speedw_forcew_wtrans_1trans_220059298413761768...421600421992422384422776423168
002000.000000252.1159671134.34.3
012000.000000252.1139671134.44.8
022000.000000252.1149771232.52.4
032000.000000252.1159251133.33.0
042000.000000252.1169051134.35.3
.......................................
4419200496.583333375.71671000126.524.6
4420200495.666667375.71371200117.016.9
4421200494.750000375.71371200112.117.2
4422200493.833333375.71171200111.711.3
4423200492.916667375.7137120015.95.4

1080 rows × 13 columns

需要注意的是groupby后的get_group得到的新dataframe里面數據的Index還是原來的index(200,592,984…)沒有重新排

numpy 包操作array

(1)寫入讀出:

import numpy as np trans=np.load(r'XXXX'); np.save(r'XXXX',trans)

(2)看形狀:

trans.shape

(3)list,array相互轉化:

a=[[[1,5],[2,6]],[[3,7],[4,8]]] a=np.array(a) #np.array(a)不改變a的內存 a.shape (2, 2, 2) b=list(a)

(4)索引:

a[:,:,0]#抽出的保持原格式 array([[1, 2],[3, 4]]) a[:][1][0][1]=9#冒號和上面的冒號意思不同,可以將[:]看作不存在 a[1][0][1] 9 a[:][1][1] array([4, 8])

(5)和list對比
(因為兩者之間有區別在進行數據處理的時候,特別是多維度可能出現list里面套array的時候需要格外注意,盡量避免這種情況)

b=[[[1,5],[2,6]],[[3,7],[4,8]]] #b[:,:,0]#報錯,無這種索引方式 b[:][1][0]#和array一樣 #list沒有shape,array不能append [3, 7] b*2#list外面的乘法表示copy [[[1, 5], [2, 6]], [[3, 7], [4, 8]], [[1, 5], [2, 6]], [[3, 7], [4, 8]]] a*2#array表示數乘 array([[[ 2, 10],[ 4, 12]],[[ 6, 18],[ 8, 16]]])

(6)reshape&flatten函數(不改變內存)

a.reshape(2,4)#高維到低維是順著排的,各維度之間的轉換需要有整除關系 array([[1, 5, 2, 6],[3, 9, 4, 8]]) a.flatten()#flatten可以排成一維 array([1, 5, 2, 6, 3, 9, 4, 8])

(7)合并:

a=[[1,2],[3,4]] b=[[5,6],[7,8]] x=np.concatenate((a,b),axis=0)#按維度 x array([[1, 2],[3, 4],[5, 6],[7, 8]]) x=np.concatenate((a,b),axis=1) x array([[1, 2, 5, 6],[3, 4, 7, 8]]) y=np.c_[a,b]#按列 y array([[1, 2, 5, 6],[3, 4, 7, 8]])

(7)初始化

migration_data = np.zeros((666), dtype='float')

(8)不同維度互換(eg:(2,3,4)矩陣換成(4,3,2))

a=np.array([[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]) a.shape (2, 3, 4) b= np.transpose(a,(2,1,0))#后面的(2,1,0)表示一個置換,即原來的shape:(2,3,4)中0號位置('2')現在在2號位置,1號位置('3')在1號位置 b.shape (4, 3, 2)

csv文件讀寫有關問題

#寫入list import csv with open(r'路徑','a+',newline='') as f:#a+表示接著在文件后面寫入writer=csv.writer(f)writer.writerows(data)

下面是一個讀取csv存入list的例子,在讀取后成行放入列表。
需要注意的是假如沒有for line in csv_reader:后面的temp=float(x) for x in line,直接存入points時得到的是包含str的List,且其中的逗號分隔符(,)也算在str里面(當然,也可以使用Dictreader按字典形式讀取)

import csv points=[] with open(r"C:\Users\10539\Desktop\數據競賽\train_data\density_filled.csv")as f:csv_reader=csv.reader(f)for line in csv_reader:temp=[float(x) for x in line]points.append(temp)#直接讀都是str

python 程序編寫中發現的問題和tricks

(1)關于利用list&dict寫循環和函數(這段代碼沒頭沒尾的僅提供形式)

Cities = ["city_A", "city_B", "city_C", "city_D", "city_E"] CitiesIndex ={'A':0,'B':1,'C':2,'D':3,'E':4}#索引方式: dict[key]def find_place(direction:int) -> int:start = CitiesIndex[direction[0][-1]]#direction是list里面嵌套一個list end = CitiesIndex[direction[1][-1]]return start * 4 + (end if start > end else end-1)count = 0 for city in Cities:with open("train_data/"+city+"/migration.csv") as f:#利用list批量錄入csv文件csv_reader = csv.reader(f,delimiter=',')for line in csv_reader:date = calcu_days(int(line[0]))index = find_place(line[1:3])for i in range(24):for j in range(grid_num[count]):migration_data[date * 24 + i, sum(grid_num[:count]) + j, index] += float(line[-1])print(sum(grid_num[:count]))count+=1

(2)attention:關于Python中循環嵌套的問題:
在多層循環中建議簡單的循環放在里面,復雜的循環放在外面。例如:讀取csv文件的循環放在外面,for i in range(5):這樣的循環放在里面。
因為python 的for 循環的內層循環是不支持循環讀取文件等較復雜循環的。如果

for i in range(5): for city in Cities:csv.DictReaderXXXX...... #這樣外面的for i 循環只會運行一次,但是可能不會報錯

(3)list的enumerate遍歷

point=[13,56,12,44] for index,row in enumerate(point):print(index,row) 0 13 1 56 2 12 3 44

(4)zip的用法
zip的用法多樣,在上面的enumerate不方便用的時候還可以利用range(len(list_a))和zip構成字典進行循環
在組成字典和元組中都很方便更多zip方法:

#(a)構成元組 a=[1,2,3,4] b=[5,6,7,8] c=zip(a,b)#c:[(1,5),(2,6),(3,7),(4,8)] for (x,y) in c:print(x+y) 6 8 10 12 #(b)構成字典 d=dict(zip(a,b)) d {1: 5, 2: 6, 3: 7, 4: 8}

(5)lambda 用法

y=lambda x:2*x+1 y(2) 5

簡單可視化

import matplotlib.pyplot as plt#借助 matplotlib包

(1)畫dataframe里的總圖

data.plot() #一般來說都沒有標準化畫出來的總圖亂糟糟作用不大 plt.show()

(2)分開畫

data['infect'].plot()#默認x軸是index #加標題,圖例,坐標軸: plt.plot(lista) plt.plot(listb) plt.title('XXX')#一般不支持有中文 plt.xlable('XX') plt.ylable('XXX') plt.legend(['a','b']) plt.show() #plt畫圖順序排legend,一般plt畫圖a,b最后plt.show都呈現在同一張圖里 <matplotlib.axes._subplots.AxesSubplot at 0x18c05fb3908>

plt.plot(data['grid'].values,data['infect'].values)#plot(x,y) [<matplotlib.lines.Line2D at 0x2eb218a88c8>]

(3)散點圖:

data.plot.scatter('density','trans_1') <matplotlib.axes._subplots.AxesSubplot at 0x18c05593f48>

(4)箱形圖:
對箱型圖的理解看這里

data[['density','trans_1']].boxplot()#數據情況屬實不好 <matplotlib.axes._subplots.AxesSubplot at 0x20a70841cc8>

數據編碼與轉換

(1)熱編碼

one-hot熱編碼:將分類變量變成多個0-1變量
關于連續函數離散化,分類指標啞元化詳見

pandas的get_dummies函數

dataa=pd.get_dummies(data,columns=['w_w']) dataa.head() datehourgridinfectdensityw_tempw_speed1trans_2w_w_0w_w_1w_w_2w_w_3w_w_4w_w_5w_w_601234
0000.0951.816107.80001000
0010.0987.2161114.10001000
0020.0665.516128.90001000
0030.0818.016137.90001000
0040.01797.9161415.60001000
(2)時間序列處理

pandas里有看這里的后面幾個cap,在脈沖神經網絡中會對時間有其他的編碼方式。

(3)空間編碼

因為這次數據中有很多point to point 的數據,但是我們在操作的過程中處理的不太好(本來想到過用連接矩陣,但是與其它的數據格式不太兼容)。
具體的一些空間編碼的方向可以參考這里

機器學習和神經網絡的初步了解

?開始的時候用了sklearn做天氣這些外源變量的回歸,還嘗試使用了XGBoost做了感染人數的回歸,但是總體的回歸效果不太好,就沒搞sklearn了。
?后來用了LSTM長短期記憶做回歸,但是效果也不好,最后用了CNN卷積神經網絡效果才好一點。

sklearn包

?sklearn包可以直接在anaconda prompt里直接下載,里面有線性回歸到隨機森林的一系列可以直接調用的相關函數。一般單核單線程,關于這個包的學習首推中文文檔

KNN和SVM

?KNN和SVM原本是兩種分類算法。SVM通過超平面和核做分類劃分,KNN則直接計算距離,根據距離遠近做劃分,具體的內容看上面的文檔,網上的大多數博客也寫的很清楚。

?還可以借助KNN對分類變量做回歸:

from sklearn.neighbors import KNeighborsClassifier X=data[['date','hour']] X=X.values y=data['w_speed'] y=y.values #y=y.astype(np.int16) neigh =KNeighborsClassifier(n_neighbors=2) neigh.fit(X,y) predict_y= neigh.predict(predict_X)

?因為KNN是根據距離做的劃分,但是不同維度的距離可能內涵不同,或者單位不統一,從而容易導致分類不準確,可以通過改變各維度的比重進行優化具體看這里

?SVM里面的SVR可以用來做回歸

from sklearn.svm import SVR X=data[['date','hour']] X=X.values y=data['w_temp'] y=y.values model = SVR() model.fit(X,y) predict_y = model.predict(predict_X)

訓練集劃分和參數訓練

主要是下面兩個函數,具體看上面的sklearn文檔,下面兩個函數還可以用在XGBoost上具體的看下面做房價預測的完整代碼例子

from sklearn.model_selection import GridSearchCV from sklearn.model_selection import ShuffleSplit cv_split = ShuffleSplit(n_splits=6, train_size=0.7, test_size=0.2) #參數集寫成字典形式 grid_params = dict(max_depth = [4, 5, 6, 7],learning_rate = np.linspace(0.03, 0.3, 10),n_estimators = [100, 200] ) grid = GridSearchCV(model, grid_params, cv=cv_split, scoring='neg_mean_squared_error') grid.fit(X, y) #看結果 print(model.best_params_) print('rmse:', (-grid_model.best_score_) ** 0.5)

XGBoost

?XGBoost在一般的分類中超好用,主要原理是多個決策樹的拼接和權重分配。具體原理看這里
還有做房價預測的完整代碼例子

?在回歸中使用XGBoost中的XGBregressor函數參數含義看這里:

#這里用的是xgboost做回歸預測的函數XGBRegressor,方法和一般的回歸模型一樣 import xgboostmodel=xgboost.XGBRegressor(objective ='reg:squarederror') X=data[['date','hour']] X=X.values y=data['w_temp'] y=y.values model=model.fit(X,y) pre=model.predict(predict_X)

?XGBoost還能做特征選取:

from xgboost import plot_importance print(model.feature_importances_)#選擇得到的比重大的

除了searchCV外的調參策略

LSTM

關于LSTM和CNN之類原理的強烈建議看這個建議從頭開始看
LSTM源自RNN,RNN具體看上面,結構上還是seq2seq結構
LSTM和CNN具體網絡結構看這里
網絡是用keras搭的,怎么搭看這里強烈推薦keras文檔
keras文檔是真的良心文檔!

神經網絡是怎樣做預測的

在上面的介紹中我們看到網絡有隱藏層(比如CNN的卷積核)里面的參數通過訓練集的輸入與結果的對比不斷優化隱藏層的參數,從而得到較好的隱藏層,這時候輸入數據通過現有的隱藏層就能得到較好的結果。
ps.看最下面CNN下面的表最后一列param是每層參數的個數,可見網絡的參數很多,如果要擬合的很好,需要大量的訓練數據!

#一個效果不佳但是能運行的LSTM網絡的例子 #這個例子是利用前80個時間的數據(包括感染人數,天氣等8個數據)得到下一個時間點的8個數據的值(對下一個時間點的8個數據處于未知狀態),也就是前80個預測后面一個 from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers import Flatten from keras.layers import Dropoutmodel = Sequential() model.add(LSTM(64, input_shape=(80,8),return_sequences=True))#輸入80組數據,每組數據8個特征 model.add(Dropout(0.5)) model.add(LSTM(64,return_sequences=True))#特征變為64個還是80組數據return_sequence這個參數很關鍵保證了網絡output的格式,一般在全連接層前設置為True model.add(LSTM(32,return_sequences=False))#特征變成32個,數據組數減小 model.add(Dense(8))#全連接層得到下一組數據 model.compile(loss='mae', optimizer='adam')#誤差mae,優化算法adam model.fit(train_x0, train_y0, epochs=10, batch_size=200) #validation_data=(test_x0, test_y0), verbose=2, shuffle=False)#測試集 predict_y0=model.predict(predict_x0)

LSTM同樣能做多步多變量預測(具體的網上有),上面的就是前80組數據預測后面一組數據,要實現對后面10組數據的預測可以通過循環的方式完成,每次把預測到的數據加入之前的80個輸入中,把之前80個輸入數據組的最開始的數據刪除。類似于數據結構隊列的亞子。
除此之外如果知道下一組數據的8個特征中的兩個,要預測另外6個特征,則可以把model.add(Dense(8))變為model.add(Dense(6)),testX不變,testY從8個數去掉兩個已知的變成6個數。如果要預測后面10組數據,則在上面的循環中每次要把預測結果加上兩個已知數據,再放入下一次輸入的80組數據中。

CNN

(先看這個!)CNN的具體原理網上有,指路B站3Blue1Brown 的CNN視頻(…B站真的是學習站…要不是因為總喜歡打開B站看別的…我是不會卸載的!)

原理、結構、怎么搭參考上面的LSTM給的網站,里面都有CNN的內容。和LSTM有相似之處。但是數據維度發生了改變,下面的網絡也是用keras搭的,具體的看上面LSTM給的keras中文文檔網址中搜Conv2D等

#先放個網絡 import tensorflow as tf input_shape = (48, 392, 7) model = tf.keras.models.Sequential([tf.keras.layers.Conv2D(64, (24,1),activation='relu', input_shape=input_shape),#tf.keras.layers.Conv2D(64, (2,2), padding='same',activation='relu'),tf.keras.layers.Conv2D(64, (3,1),strides=(2,1), activation='relu'),tf.keras.layers.Dropout(.5),tf.keras.layers.Conv2D(32, (3,3),padding='same', activation='relu'),tf.keras.layers.Dropout(.5),tf.keras.layers.Conv2D(32, (12,1), activation='relu'),tf.keras.layers.Reshape((392,32)),tf.keras.layers.Dropout(.1),tf.keras.layers.Dense(21),tf.keras.layers.Dropout(.1),tf.keras.layers.Dense(14),tf.keras.layers.Dropout(.1),tf.keras.layers.Dense(7)#tf.keras.layers.Reshape((392,7)) ]) model.compile(optimizer='adam',loss='mean_squared_error',metrics=[tf.keras.metrics.RootMeanSquaredError()]) model.summary() Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_5 (Conv2D) (None, 25, 392, 64) 10816 _________________________________________________________________ conv2d_6 (Conv2D) (None, 25, 392, 64) 16448 _________________________________________________________________ conv2d_7 (Conv2D) (None, 12, 392, 64) 12352 _________________________________________________________________ dropout_5 (Dropout) (None, 12, 392, 64) 0 _________________________________________________________________ conv2d_8 (Conv2D) (None, 12, 392, 32) 18464 _________________________________________________________________ dropout_6 (Dropout) (None, 12, 392, 32) 0 _________________________________________________________________ conv2d_9 (Conv2D) (None, 1, 392, 32) 12320 _________________________________________________________________ reshape_1 (Reshape) (None, 392, 32) 0 _________________________________________________________________ dropout_7 (Dropout) (None, 392, 32) 0 _________________________________________________________________ dense_3 (Dense) (None, 392, 21) 693 _________________________________________________________________ dropout_8 (Dropout) (None, 392, 21) 0 _________________________________________________________________ dense_4 (Dense) (None, 392, 14) 308 _________________________________________________________________ dropout_9 (Dropout) (None, 392, 14) 0 _________________________________________________________________ dense_5 (Dense) (None, 392, 7) 105 ================================================================= Total params: 71,506 Trainable params: 71,506 Non-trainable params: 0 _________________________________________________________________ model.fit(X,Y,batch_size=64,epochs=135) test = model.predict([temp])

總結

以上是生活随笔為你收集整理的数据分析初探——以2020百度西安交大大数据竞赛:传染病感染人数预测为例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美视频一二三区 | 中文国语毛片高清视频 | 最好看的中文字幕国语电影mv | 狠狠操中文字幕 | 午夜激情国产 | 精品一区二区三区入口 | 欧美午夜精品一区二区三区 | 邻居少妇张开腿让我爽了在线观看 | 在线观看免费高清 | 国产成人精品视频ⅴa片软件竹菊 | 久久久久久久9999 | 91精品国产日韩91久久久久久 | 亚洲免费视频一区 | 91亚洲精品国偷拍自产在线观看 | 免看一级a毛片一片成人不卡 | 亚洲精品激情 | 91视频在线看 | 国产精品系列在线 | 九九九九精品 | a亚洲天堂 | 国产成人短视频在线观看 | 婷婷六月丁 | 日韩精品自拍 | 香蕉污视频在线观看 | 免费看成人毛片 | 69xx国产| 操碰在线视频 | 性色AV无码久久一区二区三 | av五月天在线 | 久久久精品亚洲 | 国产69精品久久久久777 | 国产男女猛烈无遮挡a片漫画 | 好看的中文字幕电影 | 婷婷亚洲综合五月天小说 | 日韩3区| av一区二区三区在线 | 在线91观看| 韩国毛片一区二区 | 日本欧美在线播放 | 日本欧美亚洲 | 制服丝袜在线播放 | 中国精品久久 | 欧美在线性爱视频 | 欧美一级片在线看 | cao国产| a级在线观看视频 | 天天爱av| 欧美成人免费高清视频 | 一区二区视频观看 | 一区二区精品国产 | 日本一二三视频 | 中文字幕欧美色图 | 国产精品亚洲一区二区三区 | 日韩精品成人无码专区免费 | 日韩欧美一区二区一幕 | 用力抵着尿进去了h | 一区二区三区www污污污网站 | 1024av在线| 国产一级片网址 | 日本免费一区二区三区视频 | 亚洲高潮 | 手机天堂av| 欧美成人久久久 | 久久久99精品国产一区二区三区 | 欧美偷拍精品 | 亚洲爽爽 | 香蕉视频毛片 | av草逼| 亚洲国产一二三 | 亚洲自拍偷拍视频 | 天堂av观看 | 国产在线一级 | 成年人在线视频免费观看 | 国产日产亚洲系列最新 | 国产福利视频一区二区 | 亚洲人妻一区二区 | 国产丝袜一区二区三区 | 日韩中文在线视频 | 色网址在线观看 | 欧美成人女星 | 丝袜美腿亚洲综合 | 又黄又爽的免费视频 | 久久无码精品丰满人妻 | 黄色一级片免费看 | 蜜桃视频在线播放 | 91精品久| 蜜桃av乱码一区二区三区 | 国产一级片麻豆 | 一本免费视频 | chinese xxxx videos andvr| 青青草伊人| 欧美狠狠干 | 91久久久久一区二区 | 日本aaaa| avwww. | 日韩av在线播放网址 | 精品久久一区二区三区 | www.四虎.com| 国产精品27p |