# 如何加載,可視化和探索復雜的多變量多步時間序列預測數據集
> 原文: [https://machinelearningmastery.com/how-to-load-visualize-and-explore-a-complex-multivariate-multistep-time-series-forecasting-dataset/](https://machinelearningmastery.com/how-to-load-visualize-and-explore-a-complex-multivariate-multistep-time-series-forecasting-dataset/)
實時世界時間序列預測具有挑戰性,其原因不僅限于問題特征,例如具有多個輸入變量,需要預測多個時間步驟,以及需要對多個物理站點執行相同類型的預測。
EMC Data Science Global Hackathon 數據集或簡稱“_ 空氣質量預測 _”數據集描述了多個站點的天氣狀況,需要預測隨后三天的空氣質量測量結果。
在本教程中,您將發現并探索空氣質量預測數據集,該數據集代表具有挑戰性的多變量,多站點和多步驟時間序列預測問題。
完成本教程后,您將了解:
* 如何加載和探索數據集的塊結構。
* 如何探索和可視化數據集的輸入和目標變量。
* 如何使用新的理解來概述一系列方法來構建問題,準備數據和建模數據集。
讓我們開始吧。
* **Update Apr / 2019** :修正了計算總缺失值的錯誤(感謝 zhangzhe)。

如何加載,可視化和探索復雜的多變量多步時間序列預測數據集
照片由 [H Matthew Howarth](https://www.flickr.com/photos/flatworldsedge/7874109806/) ,保留一些權利。
## 教程概述
本教程分為七個部分;他們是:
1. 問題描述
2. 加載數據集
3. 塊數據結構
4. 輸入變量
5. 目標變量
6. 與目標變量的皺痕
7. 關于建模的思考
## 問題描述
EMC Data Science Global Hackathon 數據集或簡稱“_ 空氣質量預測 _”數據集描述了多個站點的天氣狀況,需要預測隨后三天的空氣質量測量結果。
具體而言,對于多個站點,每小時提供 8 天的溫度,壓力,風速和風向等天氣觀測。目標是預測未來三天在多個地點的空氣質量測量。預測的提前期不是連續的;相反,必須在 72 小時預測期內預測具體的提前期;他們是:
```py
+1, +2, +3, +4, +5, +10, +17, +24, +48, +72
```
此外,數據集被劃分為不相交但連續的數據塊,其中 8 天的數據隨后是需要預測的 3 天。
并非所有站點或塊都可以獲得所有觀察結果,并且并非所有站點和塊都可以使用所有輸出變量。必須解決大部分缺失數據。
該數據集被用作 2012 年 Kaggle 網站上[短期機器學習競賽](https://www.kaggle.com/c/dsg-hackathon)(或黑客馬拉松)的基礎。
根據從參與者中扣留的真實觀察結果評估競賽的提交,并使用平均絕對誤差(MAE)進行評分。提交要求在由于缺少數據而無法預測的情況下指定-1,000,000 的值。實際上,提供了一個插入缺失值的模板,并且要求所有提交都采用(模糊的是什么)。
獲勝者在滯留測試集([私人排行榜](https://www.kaggle.com/c/dsg-hackathon/leaderboard))上使用隨機森林在滯后觀察中獲得了 0.21058 的 MAE。該帖子中提供了此解決方案的說明:
* [把所有東西都扔進隨機森林:Ben Hamner 贏得空氣質量預測黑客馬拉松](http://blog.kaggle.com/2012/05/01/chucking-everything-into-a-random-forest-ben-hamner-on-winning-the-air-quality-prediction-hackathon/),2012。
在本教程中,我們將探索此數據集,以便更好地了解預測問題的性質,并提出如何建模的方法。
## 加載數據集
第一步是下載數據集并將其加載到內存中。
數據集可以從 Kaggle 網站免費下載。您可能必須創建一個帳戶并登錄才能下載數據集。
下載整個數據集,例如“_ 將所有 _”下載到您的工作站并使用名為' _AirQualityPrediction_ '的文件夾解壓縮當前工作目錄中的存檔
* [EMC 數據科學全球黑客馬拉松(空氣質量預測)數據](https://www.kaggle.com/c/dsg-hackathon/data)
你應該在 _AirQualityPrediction /_ 文件夾中有五個文件;他們是:
* SiteLocations.csv
* SiteLocations_with_more_sites.csv
* SubmissionZerosExceptNAs.csv
* TrainingData.csv
* sample_code.r
我們的重點將是包含訓練數據集的' _TrainingData.csv_ ',特別是塊中的數據,其中每個塊是八個連續的觀察日和目標變量。
在撰寫本文時,測試數據集(每個塊的剩余三天)不可用于此數據集。
打開' _TrainingData.csv_ '文件并查看內容。解壓縮的數據文件相對較小(21 兆字節),很容易適應 RAM。
查看文件的內容,我們可以看到數據文件包含標題行。
我們還可以看到丟失的數據標有' _NA_ '值,Pandas 將自動轉換為 _NumPy.NaN_ 。
我們可以看到'_ 工作日 _'列包含作為字符串的日期,而所有其他數據都是數字。
以下是數據文件的前幾行供參考。
```py
"rowID","chunkID","position_within_chunk","month_most_common","weekday","hour","Solar.radiation_64","WindDirection..Resultant_1","WindDirection..Resultant_1018","WindSpeed..Resultant_1","WindSpeed..Resultant_1018","Ambient.Max.Temperature_14","Ambient.Max.Temperature_22","Ambient.Max.Temperature_50","Ambient.Max.Temperature_52","Ambient.Max.Temperature_57","Ambient.Max.Temperature_76","Ambient.Max.Temperature_2001","Ambient.Max.Temperature_3301","Ambient.Max.Temperature_6005","Ambient.Min.Temperature_14","Ambient.Min.Temperature_22","Ambient.Min.Temperature_50","Ambient.Min.Temperature_52","Ambient.Min.Temperature_57","Ambient.Min.Temperature_76","Ambient.Min.Temperature_2001","Ambient.Min.Temperature_3301","Ambient.Min.Temperature_6005","Sample.Baro.Pressure_14","Sample.Baro.Pressure_22","Sample.Baro.Pressure_50","Sample.Baro.Pressure_52","Sample.Baro.Pressure_57","Sample.Baro.Pressure_76","Sample.Baro.Pressure_2001","Sample.Baro.Pressure_3301","Sample.Baro.Pressure_6005","Sample.Max.Baro.Pressure_14","Sample.Max.Baro.Pressure_22","Sample.Max.Baro.Pressure_50","Sample.Max.Baro.Pressure_52","Sample.Max.Baro.Pressure_57","Sample.Max.Baro.Pressure_76","Sample.Max.Baro.Pressure_2001","Sample.Max.Baro.Pressure_3301","Sample.Max.Baro.Pressure_6005","Sample.Min.Baro.Pressure_14","Sample.Min.Baro.Pressure_22","Sample.Min.Baro.Pressure_50","Sample.Min.Baro.Pressure_52","Sample.Min.Baro.Pressure_57","Sample.Min.Baro.Pressure_76","Sample.Min.Baro.Pressure_2001","Sample.Min.Baro.Pressure_3301","Sample.Min.Baro.Pressure_6005","target_1_57","target_10_4002","target_10_8003","target_11_1","target_11_32","target_11_50","target_11_64","target_11_1003","target_11_1601","target_11_4002","target_11_8003","target_14_4002","target_14_8003","target_15_57","target_2_57","target_3_1","target_3_50","target_3_57","target_3_1601","target_3_4002","target_3_6006","target_4_1","target_4_50","target_4_57","target_4_1018","target_4_1601","target_4_2001","target_4_4002","target_4_4101","target_4_6006","target_4_8003","target_5_6006","target_7_57","target_8_57","target_8_4002","target_8_6004","target_8_8003","target_9_4002","target_9_8003"
1,1,1,10,"Saturday",21,0.01,117,187,0.3,0.3,NA,NA,NA,14.9,NA,NA,NA,NA,NA,NA,NA,NA,5.8,NA,NA,NA,NA,NA,NA,NA,NA,747,NA,NA,NA,NA,NA,NA,NA,NA,750,NA,NA,NA,NA,NA,NA,NA,NA,743,NA,NA,NA,NA,NA,2.67923294292042,6.1816228132982,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,2.38965627997991,NA,5.56815355612325,0.690015329704154,NA,NA,NA,NA,NA,NA,2.84349016287551,0.0920223353681394,1.69321097077376,0.368089341472558,0.184044670736279,0.368089341472558,0.276067006104418,0.892616653070952,1.74842437199465,NA,NA,5.1306307034019,1.34160578423204,2.13879182993514,3.01375212399952,NA,5.67928016629218,NA
2,1,2,10,"Saturday",22,0.01,231,202,0.5,0.6,NA,NA,NA,14.9,NA,NA,NA,NA,NA,NA,NA,NA,5.8,NA,NA,NA,NA,NA,NA,NA,NA,747,NA,NA,NA,NA,NA,NA,NA,NA,750,NA,NA,NA,NA,NA,NA,NA,NA,743,NA,NA,NA,NA,NA,2.67923294292042,8.47583334194495,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,1.99138023331659,NA,5.56815355612325,0.923259948195698,NA,NA,NA,NA,NA,NA,3.1011527019063,0.0920223353681394,1.94167127626774,0.368089341472558,0.184044670736279,0.368089341472558,0.368089341472558,1.73922213845783,2.14412041407765,NA,NA,5.1306307034019,1.19577906855465,2.72209869264472,3.88871241806389,NA,7.42675098668978,NA
3,1,3,10,"Saturday",23,0.01,247,227,0.5,1.5,NA,NA,NA,14.9,NA,NA,NA,NA,NA,NA,NA,NA,5.8,NA,NA,NA,NA,NA,NA,NA,NA,747,NA,NA,NA,NA,NA,NA,NA,NA,750,NA,NA,NA,NA,NA,NA,NA,NA,743,NA,NA,NA,NA,NA,2.67923294292042,8.92192983362627,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,1.7524146053186,NA,5.56815355612325,0.680296803933673,NA,NA,NA,NA,NA,NA,3.06434376775904,0.0920223353681394,2.52141198908702,0.460111676840697,0.184044670736279,0.368089341472558,0.368089341472558,1.7852333061419,1.93246904273093,NA,NA,5.13639545700122,1.40965825154816,3.11096993445111,3.88871241806389,NA,7.68373198968942,NA
4,1,4,10,"Sunday",0,0.01,219,218,0.2,1.2,NA,NA,NA,14,NA,NA,NA,NA,NA,NA,NA,NA,4.8,NA,NA,NA,NA,NA,NA,NA,NA,751,NA,NA,NA,NA,NA,NA,NA,NA,754,NA,NA,NA,NA,NA,NA,NA,NA,748,NA,NA,NA,NA,NA,2.67923294292042,5.09824561921501,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,2.38965627997991,NA,5.6776192223642,0.612267123540305,NA,NA,NA,NA,NA,NA,3.21157950434806,0.184044670736279,2.374176252498,0.460111676840697,0.184044670736279,0.368089341472558,0.276067006104418,1.86805340797323,2.08890701285676,NA,NA,5.21710200739181,1.47771071886428,2.04157401948354,3.20818774490271,NA,4.83124285639335,NA
...
```
我們可以使用 Pandas [read_csv()函數](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)將數據文件加載到內存中,并在第 0 行指定標題行。
```py
# load dataset
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
```
我們還可以快速了解數據集中有多少缺失數據。我們可以通過首先修剪前幾列來刪除字符串工作日數據并將剩余列轉換為浮點值來實現。
```py
# trim and transform to floats
values = dataset.values
data = values[:, 6:].astype('float32')
```
然后,我們可以計算缺失觀測的總數和缺失的值的百分比。
```py
# summarize amount of missing data
total_missing = count_nonzero(isnan(data))
percent_missing = total_missing / data.size * 100
print('Total Missing: %d/%d (%.1f%%)' % (total_missing, data.size, percent_missing))
```
下面列出了完整的示例。
```py
# load dataset
from numpy import isnan
from numpy import count_nonzero
from pandas import read_csv
# load dataset
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# summarize
print(dataset.shape)
# trim and transform to floats
values = dataset.values
data = values[:, 6:].astype('float32')
# summarize amount of missing data
total_missing = count_nonzero(isnan(data))
percent_missing = total_missing / data.size * 100
print('Total Missing: %d/%d (%.1f%%)' % (total_missing, data.size, percent_missing))
```
首先運行該示例將打印已加載數據集的形狀。
我們可以看到我們有大約 37,000 行和 95 列。我們知道這些數字是誤導的,因為數據實際上被分成塊,并且列被分成不同站點的相同觀察。
我們還可以看到有超過 40%的數據丟失。這很多。數據非常不完整,在建模問題之前我們必須很好地理解這一點。
```py
(37821, 95)
Total Missing: 1922092/3366069 (57.1%)
```
## 塊數據結構
一個很好的起點是根據塊來查看數據。
### 塊持續時間
我們可以通過'chunkID'變量(列索引 1)對數據進行分組。
如果每個塊是 8 天并且觀察是每小時的,那么我們期望每塊(8 * 24)或 192 行數據。
如果有 37,821 行數據,則必須有大于或小于 192 小時的塊,因為 37,821 / 192 大約是 196.9 塊。
我們首先將數據拆分成塊。我們可以先獲得唯一的塊標識符列表。
```py
chunk_ids = unique(values[:, 1])
```
然后,我們可以收集每個塊標識符的所有行,并將它們存儲在字典中以便于訪問。
```py
chunks = dict()
# sort rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
```
下面定義了一個名為 _to_chunks()_ 的函數,它接受加載數據的 NumPy 數組,并將 _chunk_id_ 的字典返回到塊的行。
```py
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
```
數據文件中的' _position_within_chunk_ '表示塊內行的順序。在這個階段,我們假設行已經排序,不需要排序。原始數據文件的略讀似乎證實了這一假設。
一旦數據被分類成塊,我們就可以計算每個塊中的行數并查看分布,例如使用框和胡須圖。
```py
# plot distribution of chunk durations
def plot_chunk_durations(chunks):
# chunk durations in hours
chunk_durations = [len(v) for k,v in chunks.items()]
# boxplot
pyplot.subplot(2, 1, 1)
pyplot.boxplot(chunk_durations)
# histogram
pyplot.subplot(2, 1, 2)
pyplot.hist(chunk_durations)
# histogram
pyplot.show()
```
下面列出了將所有這些聯系在一起的完整示例
```py
# split data into chunks
from numpy import unique
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# plot distribution of chunk durations
def plot_chunk_durations(chunks):
# chunk durations in hours
chunk_durations = [len(v) for k,v in chunks.items()]
# boxplot
pyplot.subplot(2, 1, 1)
pyplot.boxplot(chunk_durations)
# histogram
pyplot.subplot(2, 1, 2)
pyplot.hist(chunk_durations)
# histogram
pyplot.show()
# load dataset
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
print('Total Chunks: %d' % len(chunks))
# plot chunk durations
plot_chunk_durations(chunks)
```
首先運行該示例將打印數據集中的塊數。
我們可以看到有 208,這表明每小時觀察的數量確實必須在各個塊之間變化。
```py
Total Chunks: 208
```
創建框和胡須圖以及塊持續時間的直方圖。我們可以看到中位數確實是 192,這意味著大多數塊有八天的觀察或接近它。
我們還可以看到持續時間長達約 25 行的長尾。雖然這些案例并不多,但鑒于缺乏數據,我們預計這將是一個挑戰。
該分布還提出了關于每個塊內的觀察結果可能是多么連續的問題。

盒子和須狀圖以及以小時為單位的塊長度的直方圖
### 大塊連續性
了解在沒有完整八天數據的那些塊中觀察是否連續(或不連續)可能會有所幫助。
考慮這一點的一種方法是為每個不連續的塊創建線圖并顯示觀察中的間隙。
我們可以在一個地塊上做到這一點。每個塊都有一個唯一的標識符,從 1 到 208,我們可以使用它作為序列的值,并通過 _NaN_ 值在 8 天間隔內標記缺失的觀察值,這些值不會出現在圖上。
反過來說,我們可以假設我們對一個塊中的所有時間步都有 NaN 值,然后使用' _position_within_chunk_ '列(索引 2)來確定具有值的時間步長并用它們標記它們。塊 ID。
下面的 _plot_discontinuous_chunks()_ 實現了這種行為,在同一個圖上為每個缺少行的塊創建一個系列或行。期望的是,突破線將幫助我們看到這些不完整的塊是多么連續或不連續。
```py
# plot chunks that do not have all data
def plot_discontiguous_chunks(chunks, row_in_chunk_ix=2):
n_steps = 8 * 24
for c_id,rows in chunks.items():
# skip chunks with all data
if rows.shape[0] == n_steps:
continue
# create empty series
series = [nan for _ in range(n_steps)]
# mark all rows with data
for row in rows:
# convert to zero offset
r_id = row[row_in_chunk_ix] - 1
# mark value
series[r_id] = c_id
# plot
pyplot.plot(series)
pyplot.show()
```
下面列出了完整的示例。
```py
# plot discontiguous chunks
from numpy import nan
from numpy import unique
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# plot chunks that do not have all data
def plot_discontiguous_chunks(chunks, row_in_chunk_ix=2):
n_steps = 8 * 24
for c_id,rows in chunks.items():
# skip chunks with all data
if rows.shape[0] == n_steps:
continue
# create empty series
series = [nan for _ in range(n_steps)]
# mark all rows with data
for row in rows:
# convert to zero offset
r_id = row[row_in_chunk_ix] - 1
# mark value
series[r_id] = c_id
# plot
pyplot.plot(series)
pyplot.show()
# load dataset
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# plot discontiguous chunks
plot_discontiguous_chunks(chunks)
```
運行該示例會為每個缺少數據的塊創建一個帶有一行的圖形。
每個塊的行中斷的數量和長度給出了每個塊中的觀察結果是多么不連續的概念。
許多塊確實有很長的連續數據,這是建模的一個好兆頭。
在某些情況下,塊的觀察結果非常少,而且存在的觀察結果是小的連續斑塊。模型可能具有挑戰性。
此外,并非所有這些塊都在塊的末尾有觀察結果:需要預測之前的時間段。對于那些尋求堅持最近觀察的模型而言,這些將是一個挑戰。
塊內系列數據的不連續性也將使評估模型具有挑戰性。例如,人們不能簡單地將塊數據分成兩半,在前半部分進行訓練,在觀察結果不完整時對第二部分進行測試。至少,當考慮不完整的塊數據時。

具有不連續觀察的塊的線圖
### 塊內的每日覆蓋率
塊的不連續性也表明,查看每個塊所覆蓋的小時數可能很重要。
一天中的時間在環境數據中很重要,并且假設每個塊包含相同的每日或每周周期的模型可能會發生絆倒,如果一天的開始和結束時間不同。
我們可以通過繪制每個塊的第一個小時(每天 24 小時)的分布來快速檢查這一點。
柱狀圖中的區間數設置為 24,因此我們可以清楚地看到 24 小時內每天每小時的分布。
此外,當收集塊的第一個小時時,我們小心只從那些具有所有八天數據的塊中收集它,以防丟失數據的塊在塊的開頭沒有觀察,我們知道發生。
```py
# plot distribution of chunk start hour
def plot_chunk_start_hour(chunks, hour_in_chunk_ix=5):
# chunk start hour
chunk_start_hours = [v[0, hour_in_chunk_ix] for k,v in chunks.items() if len(v)==192]
# boxplot
pyplot.subplot(2, 1, 1)
pyplot.boxplot(chunk_start_hours)
# histogram
pyplot.subplot(2, 1, 2)
pyplot.hist(chunk_start_hours, bins=24)
# histogram
pyplot.show()
```
下面列出了完整的示例。
```py
# plot distribution of chunk start hour
from numpy import nan
from numpy import unique
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# plot distribution of chunk start hour
def plot_chunk_start_hour(chunks, hour_in_chunk_ix=5):
# chunk start hour
chunk_start_hours = [v[0, hour_in_chunk_ix] for k,v in chunks.items() if len(v)==192]
# boxplot
pyplot.subplot(2, 1, 1)
pyplot.boxplot(chunk_start_hours)
# histogram
pyplot.subplot(2, 1, 2)
pyplot.hist(chunk_start_hours, bins=24)
# histogram
pyplot.show()
# load dataset
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# plot distribution of chunk start hour
plot_chunk_start_hour(chunks)
```
運行該示例將創建一個框和胡須圖以及每個塊中第一個小時的直方圖。
我們可以看到當天 24 小時內合理均勻的開始時間分布。
此外,這意味著每個塊的預測間隔也將在 24 小時內變化。這為可能期望標準三天預測期(午夜至午夜)的模型增加了皺紋。

每個塊內觀察的第一個小時的分布
現在我們已經了解了數據的塊結構,讓我們仔細研究描述氣象觀測的輸入變量。
## 輸入變量
有 56 個輸入變量。
前六個(索引 0 到 5)是塊的元數據信息和觀察的時間。他們是:
```py
rowID
chunkID
position_within_chunk
month_most_common
weekday
hour
```
其余 50 個描述了特定地點的氣象信息;他們是:
```py
Solar.radiation_64
WindDirection..Resultant_1
WindDirection..Resultant_1018
WindSpeed..Resultant_1
WindSpeed..Resultant_1018
Ambient.Max.Temperature_14
Ambient.Max.Temperature_22
Ambient.Max.Temperature_50
Ambient.Max.Temperature_52
Ambient.Max.Temperature_57
Ambient.Max.Temperature_76
Ambient.Max.Temperature_2001
Ambient.Max.Temperature_3301
Ambient.Max.Temperature_6005
Ambient.Min.Temperature_14
Ambient.Min.Temperature_22
Ambient.Min.Temperature_50
Ambient.Min.Temperature_52
Ambient.Min.Temperature_57
Ambient.Min.Temperature_76
Ambient.Min.Temperature_2001
Ambient.Min.Temperature_3301
Ambient.Min.Temperature_6005
Sample.Baro.Pressure_14
Sample.Baro.Pressure_22
Sample.Baro.Pressure_50
Sample.Baro.Pressure_52
Sample.Baro.Pressure_57
Sample.Baro.Pressure_76
Sample.Baro.Pressure_2001
Sample.Baro.Pressure_3301
Sample.Baro.Pressure_6005
Sample.Max.Baro.Pressure_14
Sample.Max.Baro.Pressure_22
Sample.Max.Baro.Pressure_50
Sample.Max.Baro.Pressure_52
Sample.Max.Baro.Pressure_57
Sample.Max.Baro.Pressure_76
Sample.Max.Baro.Pressure_2001
Sample.Max.Baro.Pressure_3301
Sample.Max.Baro.Pressure_6005
Sample.Min.Baro.Pressure_14
Sample.Min.Baro.Pressure_22
Sample.Min.Baro.Pressure_50
Sample.Min.Baro.Pressure_52
Sample.Min.Baro.Pressure_57
Sample.Min.Baro.Pressure_76
Sample.Min.Baro.Pressure_2001
Sample.Min.Baro.Pressure_3301
Sample.Min.Baro.Pressure_6005
```
真的,只有八個氣象輸入變量:
```py
Solar.radiation
WindDirection..Resultant
WindSpeed..Resultant
Ambient.Max.Temperature
Ambient.Min.Temperature
Sample.Baro.Pressure
Sample.Max.Baro.Pressure
Sample.Min.Baro.Pressure
```
這些變量記錄在 23 個獨特的站點中;他們是:
```py
1, 14, 22, 50, 52, 57, 64, 76, 1018, 2001, 3301, 6005
```
數據非常復雜。
并非所有變量都記錄在所有站點上。
目標變量中使用的站點標識符有一些重疊,例如 1,50,64 等。
目標變量中使用的站點標識符未在輸入變量中使用,例如 4002.還有在輸入中使用的站點標識符,這些站點標識符未在目標標識符中使用,例如 15。
這表明,至少并非所有變量都記錄在所有位置。這些錄制站在各個站點之間是異構的。此外,對于僅收集給定類型的度量或收集所有度量的站點,可能存在一些特殊情況。
讓我們仔細看看輸入變量的數據。
### 塊的輸入的時間結構
我們可以從查看每個塊的輸入結構和分布開始。
所有八天觀察的前幾個塊的塊大小為 1,3 和 5。
我們可以枚舉所有輸入列并為每個輸入列創建一個線圖。這將為每個輸入變量創建一個時間序列線圖,以便大致了解每個輸入變量的變化情況。
我們可以針對幾個塊重復這一點,以了解時間結構如何在塊之間有所不同。
下面名為 _plot_chunk_inputs()_ 的函數獲取塊格式的數據和要繪制的塊 ID 列表。它將創建一個包含 50 個線圖的圖形,每個輸入變量一個,每個圖塊 n 行,每個塊一個。
```py
# plot all inputs for one or more chunk ids
def plot_chunk_inputs(chunks, c_ids):
pyplot.figure()
inputs = range(6, 56)
for i in range(len(inputs)):
ax = pyplot.subplot(len(inputs), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = inputs[i]
for chunk_id in c_ids:
rows = chunks[chunk_id]
pyplot.plot(rows[:,column])
pyplot.show()
```
下面列出了完整的示例。
```py
# plot inputs for a chunk
from numpy import unique
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# plot all inputs for one or more chunk ids
def plot_chunk_inputs(chunks, c_ids):
pyplot.figure()
inputs = range(6, 56)
for i in range(len(inputs)):
ax = pyplot.subplot(len(inputs), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = inputs[i]
for chunk_id in c_ids:
rows = chunks[chunk_id]
pyplot.plot(rows[:,column])
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# plot inputs for some chunks
plot_chunk_inputs(chunks, [1])
```
運行該示例將創建一個包含 50 個線圖的單個圖形,每個圖形用于每個氣象輸入變量。
這些圖很難看,因此您可能希望增加所創建圖形的大小。
我們可以看到前五個變量的觀察看起來非常完整;這些是太陽輻射,風速和風向。其余變量看起來非常不完整,至少對于這個塊而言。

1 個塊的所有輸入變量的并行時間序列線圖
我們可以更新示例并繪制前三個塊的輸入變量,并進行完整的八天觀察。
```py
plot_chunk_inputs(chunks, [1, 3 ,5])
```
運行該示例將創建相同的 50 個線圖,每個圖每個圖有三個系列或線,每個塊一個。
同樣,該圖使單個圖很難看到,因此您可能需要增加圖的大小以更好地查看模式。
我們可以看到這三個圖在每個線圖中都顯示出類似的結構。這是有幫助的發現,因為它表明跨多個塊建模相同的變量可能是有用的。

3 個塊的所有輸入變量的并行時間序列線圖
它確實提出了關于變量的分布是否在不同站點之間差異很大的問題。
### 輸入數據分布
我們可以使用 box 和 whisker 圖粗略地查看輸入變量的分布。
下面的 _plot_chunk_input_boxplots()_ 將為每個輸入要素創建一個盒子和胡須,用于一個塊的數據。
```py
# boxplot for input variables for a chuck
def plot_chunk_input_boxplots(chunks, c_id):
rows = chunks[c_id]
pyplot.boxplot(rows[:,6:56])
pyplot.show()
```
下面列出了完整的示例。
```py
# boxplots of inputs for a chunk
from numpy import unique
from numpy import isnan
from numpy import count_nonzero
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# boxplot for input variables for a chuck
def plot_chunk_input_boxplots(chunks, c_id):
rows = chunks[c_id]
pyplot.boxplot(rows[:,6:56])
pyplot.show()
# load data
dataset = read_csv('TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# boxplot for input variables
plot_chunk_input_boxplots(chunks, 1)
```
運行該示例將創建 50 個箱圖,每個輸入變量用于訓練數據集中第一個塊中的觀察。
我們可以看到相同類型的變量可能具有相同的觀察范圍,并且每組變量似乎具有不同的單位。也許是風向的度數,壓力的百帕斯卡,溫度的攝氏度等等。

一個塊的輸入變量的框和胡須圖
對于八種變量類型中的每一種,進一步研究觀察的分布和擴散可能是有趣的。這是一個進一步的練習。
我們對輸入變量有一些粗略的想法,也許它們可能對預測目標變量很有用。我們無法確定。
我們現在可以將注意力轉向目標變量。
## 目標變量
預測問題的目標是預測多個站點的多個變量,為期三天。
有 39 個時間序列變量可供預測。
從列標題中,它們是:
```py
"target_1_57","target_10_4002","target_10_8003","target_11_1","target_11_32","target_11_50","target_11_64","target_11_1003","target_11_1601","target_11_4002","target_11_8003","target_14_4002","target_14_8003","target_15_57","target_2_57","target_3_1","target_3_50","target_3_57","target_3_1601","target_3_4002","target_3_6006","target_4_1","target_4_50","target_4_57","target_4_1018","target_4_1601","target_4_2001","target_4_4002","target_4_4101","target_4_6006","target_4_8003","target_5_6006","target_7_57","target_8_57","target_8_4002","target_8_6004","target_8_8003","target_9_4002","target_9_8003"
```
這些列標題的命名約定是:
```py
target_[variable identifier]_[site identifier]]
```
我們可以使用一點 regex 將這些列標題轉換為變量 id 和 site id 的小數據集。
結果如下:
```py
var, site
1,57
10,4002
10,8003
11,1
11,32
11,50
11,64
11,1003
11,1601
11,4002
11,8003
14,4002
14,8003
15,57
2,57
3,1
3,50
3,57
3,1601
3,4002
3,6006
4,1
4,50
4,57
4,1018
4,1601
4,2001
4,4002
4,4101
4,6006
4,8003
5,6006
7,57
8,57
8,4002
8,6004
8,8003
9,4002
9,8003
```
有用的是,目標按變量 id 分組。
我們可以看到,可能需要跨多個站點預測一個變量;例如,在站點 1,32,50 等處預測的變量 11,等等:
```py
var, site
11,1
11,32
11,50
11,64
11,1003
11,1601
11,4002
11,8003
```
我們可以看到,對于給定的站點,可能需要預測不同的變量。例如,站點 50 需要變量 11,3 和 4:
```py
var, site
11,50
3,50
4,50
```
我們可以將目標的小數據集保存到名為“ _targets.txt_ ”的文件中并加載它以進行快速分析。
```py
# summarize targets
from numpy import unique
from pandas import read_csv
# load dataset
dataset = read_csv('targets.txt', header=0)
values = dataset.values
# summarize unique
print('Unique Variables: %d' % len(unique(values[:, 0])))
print('Unique Sites: %d' % len(unique(values[:, 1])))
```
運行該示例將打印唯一變量和站點的數量。
如果我們預測所有站點的所有變量,我們可以看到 39 個目標變量遠小于(12 * 14)168。
```py
Unique Variables: 12
Unique Sites: 14
```
讓我們仔細看看目標變量的數據。
### 大塊目標的時間結構
我們可以從每個塊的目標結構和分布開始。
所有八天觀察的前幾個塊的塊大小為 1,3 和 5。
我們可以枚舉所有目標列,并為每個列創建一個線圖。這將為每個目標變量創建一個時間序列線圖,以大致了解它如何隨時間變化。
我們可以針對幾個塊重復這一點,以大致了解時間結構如何在塊之間變化。
下面的函數名為 _plot_chunk_targets()_,以塊格式和塊 ID 列表繪制。它將創建一個包含 39 個線圖的圖形,每個目標變量一個,每個圖塊 n 行,每個塊一個。
```py
# plot all targets for one or more chunk ids
def plot_chunk_targets(chunks, c_ids):
pyplot.figure()
targets = range(56, 95)
for i in range(len(targets)):
ax = pyplot.subplot(len(targets), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = targets[i]
for chunk_id in c_ids:
rows = chunks[chunk_id]
pyplot.plot(rows[:,column])
pyplot.show()
```
下面列出了完整的示例。
```py
# plot targets for a chunk
from numpy import unique
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# plot all targets for one or more chunk ids
def plot_chunk_targets(chunks, c_ids):
pyplot.figure()
targets = range(56, 95)
for i in range(len(targets)):
ax = pyplot.subplot(len(targets), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = targets[i]
for chunk_id in c_ids:
rows = chunks[chunk_id]
pyplot.plot(rows[:,column])
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# plot targets for some chunks
plot_chunk_targets(chunks, [1])
```
運行該示例將為塊標識符“1”創建一個包含 39 個線圖的單個圖形。
這些圖很小,但大致了解變量的時間結構。
我們可以看到,有多個變量沒有這個塊的數據。這些不能直接預測,也可能不是間接預測。
這表明除了沒有所有站點的所有變量之外,甚至列標題中指定的變量也可能不存在于某些塊中。
我們還可以在一些系列中看到缺失值的中斷。這表明即使我們可能對塊中的每個時間步進行觀察,我們也可能沒有塊中所有變量的連續序列。
許多情節都有一個循環結構。大多數都有八個峰值,很可能對應于塊內八天的觀察。這種季節性結構可以直接建模,也可以在建模時從數據中刪除,并添加回預測的時間間隔。
該系列似乎沒有任何趨勢。

1 個塊的所有目標變量的并行時間序列線圖
我們可以重新運行該示例并使用完整數據繪制前三個塊的目標變量。
```py
# plot targets for some chunks
plot_chunk_targets(chunks, [1, 3 ,5])
```
運行該示例將創建一個圖形,其中包含 39 個圖形和每個圖形的三個時間序列,一個用于每個塊的目標。
繪圖很忙,您可能希望增加繪圖窗口的大小,以便更好地查看目標變量的塊之間的比較。
對于許多具有循環日常結構的變量,我們可以看到在整個塊中重復的結構。
這是令人鼓舞的,因為它表明為站點建模變量可能對塊有所幫助。
此外,曲線 3 至 10 對應于七個不同位置的變量 11。這些圖中時間結構的字符串相似性表明,對跨站點使用的每個變量的數據建模可能是有益的。

3 個塊的所有目標變量的并行時間序列線圖
### 目標變量的箱線圖分布
查看目標變量的分布也很有用。
我們可以首先通過為每個目標變量創建框和晶須圖來查看每個目標變量的分布。
可以為每個目標并排創建單獨的箱圖,允許在相同比例下直接比較值的形狀和范圍。
```py
# boxplot for target variables for a chuck
def plot_chunk_targets_boxplots(chunks, c_id):
rows = chunks[c_id]
pyplot.boxplot(rows[:,56:])
pyplot.show()
```
下面列出了完整的示例。
```py
# boxplots of targets for a chunk
from numpy import unique
from numpy import isnan
from numpy import count_nonzero
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# boxplot for target variables for a chuck
def plot_chunk_targets_boxplots(chunks, c_id):
rows = chunks[c_id]
pyplot.boxplot(rows[:,56:])
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# boxplot for target variables
plot_chunk_targets_boxplots(chunks, 1)
```
運行該示例將創建一個包含 39 個箱圖的圖形,第一個塊的 39 個目標變量中的每一個都有一個。
我們可以看到許多變量的中位數接近零或一;我們還可以看到大多數變量存在大的不對稱差異,這表明變量可能與異常值存在偏差。
令人鼓舞的是,7 個站點的變量 11 的 4-10 的箱形圖顯示了類似的分布。這進一步證明了數據可以按變量分組并用于擬合可跨站點使用的模型。

一個塊的目標變量的框和胡須圖
我們可以使用跨所有塊的數據重新創建此圖,以查看數據集范圍的模式。
下面列出了完整的示例。
```py
# boxplots of targets for all chunks
from pandas import read_csv
from matplotlib import pyplot
# boxplot for all target variables
def plot_target_boxplots(values):
pyplot.boxplot(values[:,56:])
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# boxplot for target variables
values = dataset.values
plot_target_boxplots(values)
```
運行該示例將創建一個新圖形,顯示整個訓練數據集的 39 個框和胡須圖,而不管塊是什么。
這有點亂,圓圈異常值掩蓋了主要的數據分布。
我們可以看到異常值確實擴展到 5 到 10 個單位。這表明在建模時可能在標準化和/或重新縮放目標方面有一些用處。
也許最有用的發現是,有些目標沒有任何(或非常多)數據而不管塊數。這些列可能應該從數據集中排除。

所有訓練數據的目標變量的框和胡須圖
### 顯然空目標列
我們可以通過創建每列缺失數據比率的條形圖來進一步研究明顯的缺失數據,不包括開頭的元數據列(例如前五列)。
下面的 _plot_col_percentage_missing()_ 函數實現了這個功能。
```py
# bar chart of the ratio of missing data per column
def plot_col_percentage_missing(values, ix_start=5):
ratios = list()
# skip early columns, with meta data or strings
for col in range(ix_start, values.shape[1]):
col_data = values[:, col].astype('float32')
ratio = count_nonzero(isnan(col_data)) / len(col_data) * 100
ratios.append(ratio)
if ratio > 90.0:
print(col, ratio)
col_id = [x for x in range(ix_start, values.shape[1])]
pyplot.bar(col_id, ratios)
pyplot.show()
```
下面列出了完整的示例。
```py
# summarize missing data per column
from numpy import isnan
from numpy import count_nonzero
from pandas import read_csv
from matplotlib import pyplot
# bar chart of the ratio of missing data per column
def plot_col_percentage_missing(values, ix_start=5):
ratios = list()
# skip early columns, with meta data or strings
for col in range(ix_start, values.shape[1]):
col_data = values[:, col].astype('float32')
ratio = count_nonzero(isnan(col_data)) / len(col_data) * 100
ratios.append(ratio)
if ratio > 90.0:
print(ratio)
col_id = [x for x in range(ix_start, values.shape[1])]
pyplot.bar(col_id, ratios)
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# plot ratio of missing data per column
values = dataset.values
plot_col_percentage_missing(values)
```
如果比率高于 90%,則首先運行示例打印列 id(零偏移)和缺失數據的比率。
我們可以看到,實際上沒有非 NaN 數據為零的列,但可能有二十多個(12)具有超過 90%的缺失數據。
有趣的是,其中七個是目標變量(指數 56 或更高)。
```py
11 91.48885539779488
20 91.48885539779488
29 91.48885539779488
38 91.48885539779488
47 91.48885539779488
58 95.38880516115385
66 96.9805134713519
68 95.38880516115385
72 97.31630575606145
86 95.38880516115385
92 95.38880516115385
94 95.38880516115385
```
創建列索引號與缺失數據比率的條形圖。
我們可以看到,對于缺失數據的比率可能存在一些分層,群集低于 10%,群集約為 70%,群集高于 90%。
我們還可以看到輸入變量和目標變量之間的分離,前者非常規則,因為它們顯示了在不同站點測量的相同變量類型。
某些目標變量的這些少量數據表明除了過去的觀察之外還需要利用其他因素來進行預測。

每列缺失數據百分比的條形圖
### 目標變量的直方圖分布
目標變量的分布不整齊,至少可以是非高斯分布,或者最差的是高度多模態。
我們可以通過查看目標變量的直方圖來查看單個塊的數據。
matplotlib 中 _hist()_ 函數的一個問題是它對 NaN 值不穩健。我們可以通過在繪制之前檢查每列是否具有非 NaN 值并排除具有 NaN 值的行來克服此問題。
下面的函數執行此操作,并為一個或多個塊的每個目標變量創建一個直方圖。
```py
# plot distribution of targets for one or more chunk ids
def plot_chunk_targets_hist(chunks, c_ids):
pyplot.figure()
targets = range(56, 95)
for i in range(len(targets)):
ax = pyplot.subplot(len(targets), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = targets[i]
for chunk_id in c_ids:
rows = chunks[chunk_id]
# extract column of interest
col = rows[:,column].astype('float32')
# check for some data to plot
if count_nonzero(isnan(col)) < len(rows):
# only plot non-nan values
pyplot.hist(col[~isnan(col)], bins=100)
pyplot.show()
```
下面列出了完整的示例。
```py
# plot distribution of targets for a chunk
from numpy import unique
from numpy import isnan
from numpy import count_nonzero
from pandas import read_csv
from matplotlib import pyplot
# split the dataset by 'chunkID', return a dict of id to rows
def to_chunks(values, chunk_ix=1):
chunks = dict()
# get the unique chunk ids
chunk_ids = unique(values[:, chunk_ix])
# group rows by chunk id
for chunk_id in chunk_ids:
selection = values[:, chunk_ix] == chunk_id
chunks[chunk_id] = values[selection, :]
return chunks
# plot distribution of targets for one or more chunk ids
def plot_chunk_targets_hist(chunks, c_ids):
pyplot.figure()
targets = range(56, 95)
for i in range(len(targets)):
ax = pyplot.subplot(len(targets), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = targets[i]
for chunk_id in c_ids:
rows = chunks[chunk_id]
# extract column of interest
col = rows[:,column].astype('float32')
# check for some data to plot
if count_nonzero(isnan(col)) < len(rows):
# only plot non-nan values
pyplot.hist(col[~isnan(col)], bins=100)
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# group data by chunks
values = dataset.values
chunks = to_chunks(values)
# plot targets for some chunks
plot_chunk_targets_hist(chunks, [1])
```
運行該示例將創建一個包含 39 個直方圖的圖形,一個用于第一個塊的每個目標變量。
情節難以閱讀,但是大量的垃圾箱會顯示變量的分布。
可以公平地說,也許沒有一個目標變量具有明顯的高斯分布。許多人的右側尾部可能有偏斜的分布。
其他變量具有看似非常離散的分布,可能是所選測量設備或測量尺度的人工產物。

一個塊的每個目標變量的直方圖
我們可以使用所有塊的目標變量重新創建相同的圖。
下面列出了完整的示例。
```py
# plot distribution of all targets
from numpy import isnan
from numpy import count_nonzero
from pandas import read_csv
from matplotlib import pyplot
# plot histogram for each target variable
def plot_target_hist(values):
pyplot.figure()
targets = range(56, 95)
for i in range(len(targets)):
ax = pyplot.subplot(len(targets), 1, i+1)
ax.set_xticklabels([])
ax.set_yticklabels([])
column = targets[i]
# extract column of interest
col = values[:,column].astype('float32')
# check for some data to plot
if count_nonzero(isnan(col)) < len(values):
# only plot non-nan values
pyplot.hist(col[~isnan(col)], bins=100)
pyplot.show()
# load data
dataset = read_csv('AirQualityPrediction/TrainingData.csv', header=0)
# plot targets for all chunks
values = dataset.values
plot_target_hist(values)
```
運行該示例將創建一個包含 39 個直方圖的圖形,一個用于訓練數據集中的每個目標變量。
我們可以看到更全面的分布,更具洞察力。
第一批情節可能顯示出高度傾斜的分布,其核心可能是也可能不是高斯分布。
我們可以看到許多具有間隙的類高斯分布,這表明對高斯分布的連續變量施加了離散測量。
我們還可以看到一些顯示指數分布的變量。
總之,這表明使用[功率變換](https://machinelearningmastery.com/power-transform-time-series-forecast-data-python/)來探索將數據重塑為更高斯,和/或使用不依賴于變量的高斯分布的非參數建模方法。例如,可以預期經典線性方法具有困難時間。

整個訓練數據集的每個目標變量的直方圖
## 與目標變量的皺痕
比賽結束后,提供數據的人 [David Chudzicki](https://www.linkedin.com/in/david-chudzicki-3ba1a92a/) 總結了 12 個輸出變量的真實含義。
這是在標題為“[目標變量確實是](https://www.kaggle.com/c/dsg-hackathon/discussion/1830)”的表格帖子中提供的,部分復制如下:
```py
Description Target Variable
Carbon monoxide, 8
Sulfur dioxide, 4
SO2 max 5-min avg, 3
Nitric oxide (NO), 10
Nitrogen dioxide (NO2), 14
Oxides of nitrogen (NOx), 9
Ozone, 11
PM10 Total 0-10um STP, 5
OC CSN Unadjusted PM2.5 LC TOT, 15
Total Nitrate PM2.5 LC, 2
EC CSN PM2.5 LC TOT, 1
Total Carbon PM2.5 LC TOT, 7
Sulfate PM2.5 LC, 8
PM2.5 Raw Data, 4
PM2.5 AQI & Speciation Mass, 3
```
這很有意思,因為我們可以看到目標變量本質上是氣象的,并且與競爭的名稱所暗示的空氣質量有關。
問題是數據集中有 15 個變量,只有 12 種不同類型的目標變量。
此問題的原因是數據集中的相同目標變量可用于表示不同的目標變量。特別:
* 目標 8 可以是'_ 一氧化碳 _'或'_ 硫酸鹽 PM2.5LC_ '的數據。
* 目標 4 可以是'_ 二氧化硫 _'或' _PM2.5 原始數據 _'的數據。
* 目標 3 可以是' _SO2 最大 5 分鐘平均 _'或' _PM2.5 AQI&amp;形態質量 _'。
根據變量的名稱,將數據加倍到相同的目標變量,使用具有不同化學特征的變量,甚至可能使用例如測量的變量。它似乎是偶然的而不是戰略性的。
目前尚不清楚,但很可能目標代表一個塊中的一個變量,但可能代表塊之間的不同變量。或者,變量可能在每個塊內的站點之間不同。在前一種情況下,這意味著期望跨塊的這些目標變量的一致性的模型,這是一個非常合理的假設,可能有困難。在后者中,模型可以將變量位點組合視為不同的變量。
可以通過比較這些變量在塊之間的分布和比例來梳理差異。
這是令人失望的,并且取決于模型技能的重要性,可能需要從數據集中刪除這些變量,這些變量是很多目標變量(39 個中的 20 個)。
## 關于建模的思考
在本節中,我們將利用我們發現的有關該問題的方法,并提出一些建模此問題的方法。
我喜歡這個數據集;它是凌亂的,現實的,抵制樸素的方法。
本節分為四個部分;他們是:
* 取景。
* 數據準備。
* 造型。
* 評價。
### 取景
該問題通常被視為多變量多步驟時間序列預測問題。
此外,需要跨多個站點預測多個變量,這是時間序列預測問題的常見結構細分,例如,預測不同物理位置(例如商店或車站)的可變物。
讓我們來看看數據的一些可能的框架。
#### 按變量和站點單變量
第一種方法可能是將每個站點的每個變量視為單變量時間序列預測問題。
對模型進行 8 天的每小時觀察,并要求預測三天,從中獲取并使用或評估預測提前期的特定子集。
在一些選擇的情況下,這可能是可能的,這可以通過一些進一步的數據分析來確認。
然而,數據通常抵抗這種框架,因為并非所有塊都對每個目標變量進行了 8 天的觀察。此外,目標變量的時間序列可能非常不連續,即使不是大多數(90%到 95%)不完整。
我們可以放松對模型所需的先前數據的結構和數量的期望,設計模型以利用可用的任何東西。
這種方法每塊需要 39 個模型,總共需要(208 * 39)或 8,112 個獨立模型。這聽起來有可能,但可能比我們從工程角度更喜歡的可擴展性。
可變站點組合可以跨塊建模,僅需要 39 個模型。
#### 單變量變量
目標變量可以跨站點聚合。
我們還可以放松使用滯后時間進行預測,并使用零填充或輸入缺失值來顯示可用的內容,或者甚至是滯后觀察而忽略前置時間。
然后,我們可以根據給定變量的先前觀察結果對問題進行框架,預測接下來的三天。
這些模型可能有更多可以使用,但會忽略基于站點的任何變量差異。這可能是也可能不是沒有理由的,可以通過比較跨站點的變量分布來檢查。
有 12 個獨特的變量。
我們可以為每個塊建模每個變量,給出(208 * 12)或 2,496 個模型。在塊上建模 12 個變量可能更有意義,只需要 12 個模型。
#### 多變量模型
也許一個或多個目標變量依賴于一個或多個氣象變量,甚至依賴于其他目標變量。
這可以通過調查每個目標變量和每個輸入變量之間的相關性以及其他目標變量來探索。
如果存在或可以假設這樣的依賴性,則不僅可以預測具有更完整數據的變量,還可以預測具有 90%以上缺失數據的目標變量。
這些模型可以使用先前氣象觀測的一些子集和/或目標變量觀測作為輸入。數據的不連續性可能需要放寬輸入變量的傳統滯后時間結構,允許模型使用可用于特定預測的任何內容。
## 數據準備
根據模型的選擇,輸入和目標變量可能會受益于某些數據準備,例如:
* 標準化。
* 正常化。
* 功率變換,高斯。
* 季節性差異,存在季節性結構。
為了解決丟失的數據,在某些情況下,可能需要通過簡單的持久性或平均來進行估算。
在其他情況下,并且取決于模型的選擇,可以直接從 NaN 值學習作為觀察(例如 XGBoost 可以這樣做)或填充 0 值并屏蔽輸入(例如 LSTM 可以這樣做)。
研究降尺度輸入到 2,4 或 12 小時數據或類似數據以試圖填補不連續數據中的空白,例如,可能是有趣的。每小時從 12 小時數據預測。
### 造型
建模可能需要一些原型來發現在方法和選擇的輸入觀察方面有效的方法。
#### 經典方法
可能存在具有完整數據的塊的罕見示例,其中諸如 ETS 或 SARIMA 的經典方法可用于單變量預測。
通常,該問題抵制經典方法。
#### 機器學習
一個很好的選擇是使用非線性機器學習方法,這些方法與輸入數據的時間結構無關,利用任何可用的東西。
此類模型可用于遞歸或直接策略以預測提前期。直接策略可能更有意義,每個所需的提前期有一個模型。
有 10 個交付周期和 39 個目標變量,在這種情況下,直接策略需要(39 * 10)或 390 個模型。
對問題建模的直接方法的缺點是模型無法利用預測區間中目標變量之間的任何依賴關系,特別是跨站點,跨變量或跨越提前期。如果這些依賴存在(并且肯定會存在),則可以在使用第二層集合模型時添加它們的味道。
特征選擇可用于發現變量和/或滯后時間,這可以在預測每個目標變量和提前期時提供最大價值。
這種方法將提供很大的靈活性,正如競爭中所示,決策樹的集合在很少調整的情況下表現良好。
#### 深度學習
與機器學習方法一樣,深度學習方法可能能夠使用任何可用的多變量數據來進行預測。
對于這個問題,兩類神經網絡可能值得探索:
* 卷積神經網絡或 CNN。
* 循環神經網絡,特別是長短期記憶網絡或 LSTM。
CNN 能夠將多變量輸入時間序列數據的長序列提取到小特征映射中,并且實質上從與預測最相關的序列中學習特征。它們在輸入序列中處理噪聲和特征不變性的能力可能是有用的。與其他神經網絡一樣,CNN 可以輸出向量以預測預測的提前期。
LSTM 旨在處理序列數據,并可通過屏蔽直接支持丟失的數據。它們也能夠從長輸入序列自動進行特征學習,單獨或與 CNN 結合可以很好地解決這個問題。與編碼器 - 解碼器架構一起,LSTM 網絡可用于本地預測多個交付周期。
### 評估
一種反映競爭中使用的樸素方法可能最適合評估模型。
也就是說,將每個塊分成訓練和測試集,在這種情況下使用前五天的數據進行訓練,其余三個用于測試。
通過在整個數據集上進行訓練并將預測提交給 Kaggle 網站以評估所保持的測試數據集,最終確定模型可能是有趣的。
## 進一步閱讀
如果您希望深入了解,本節將提供有關該主題的更多資源。
* [標準多變量,多步驟和多站點時間序列預測問題](https://machinelearningmastery.com/standard-multivariate-multi-step-multi-site-time-series-forecasting-problem/)
* [EMC 數據科學全球黑客馬拉松(空氣質量預測)](https://www.kaggle.com/c/dsg-hackathon/data)
* [將所有東西放入隨機森林:Ben Hamner 贏得空氣質量預測黑客馬拉松](http://blog.kaggle.com/2012/05/01/chucking-everything-into-a-random-forest-ben-hamner-on-winning-the-air-quality-prediction-hackathon/)
* [EMC 數據科學全球黑客馬拉松(空氣質量預測)的獲獎代碼](https://github.com/benhamner/Air-Quality-Prediction-Hackathon-Winning-Model)
* [分區模型的一般方法?](https://www.kaggle.com/c/dsg-hackathon/discussion/1821)
## 摘要
在本教程中,您發現并探索了空氣質量預測數據集,該數據集代表了具有挑戰性的多變量,多站點和多步驟時間序列預測問題。
具體來說,你學到了:
* 如何加載和探索數據集的塊結構。
* 如何探索和可視化數據集的輸入和目標變量。
* 如何使用新的理解來概述一系列方法來構建問題,準備數據和建模數據集。
你有任何問題嗎?
在下面的評論中提出您的問題,我會盡力回答。
- Machine Learning Mastery 應用機器學習教程
- 5競爭機器學習的好處
- 過度擬合的簡單直覺,或者為什么測試訓練數據是一個壞主意
- 特征選擇簡介
- 應用機器學習作為一個搜索問題的溫和介紹
- 為什么應用機器學習很難
- 為什么我的結果不如我想的那么好?你可能過度擬合了
- 用ROC曲線評估和比較分類器表現
- BigML評論:發現本機學習即服務平臺的聰明功能
- BigML教程:開發您的第一個決策樹并進行預測
- 構建生產機器學習基礎設施
- 分類準確性不夠:可以使用更多表現測量
- 一種預測模型的巧妙應用
- 機器學習項目中常見的陷阱
- 數據清理:將凌亂的數據轉換為整潔的數據
- 機器學習中的數據泄漏
- 數據,學習和建模
- 數據管理至關重要以及為什么需要認真對待它
- 將預測模型部署到生產中
- 參數和超參數之間有什么區別?
- 測試和驗證數據集之間有什么區別?
- 發現特征工程,如何設計特征以及如何獲得它
- 如何開始使用Kaggle
- 超越預測
- 如何在評估機器學習算法時選擇正確的測試選項
- 如何定義機器學習問題
- 如何評估機器學習算法
- 如何獲得基線結果及其重要性
- 如何充分利用機器學習數據
- 如何識別數據中的異常值
- 如何提高機器學習效果
- 如何在競爭機器學習中踢屁股
- 如何知道您的機器學習模型是否具有良好的表現
- 如何布局和管理您的機器學習項目
- 如何為機器學習準備數據
- 如何減少最終機器學習模型中的方差
- 如何使用機器學習結果
- 如何解決像數據科學家這樣的問題
- 通過數據預處理提高模型精度
- 處理機器學習的大數據文件的7種方法
- 建立機器學習系統的經驗教訓
- 如何使用機器學習清單可靠地獲得準確的預測(即使您是初學者)
- 機器學習模型運行期間要做什么
- 機器學習表現改進備忘單
- 來自世界級從業者的機器學習技巧:Phil Brierley
- 模型預測精度與機器學習中的解釋
- 競爭機器學習的模型選擇技巧
- 機器學習需要多少訓練數據?
- 如何系統地規劃和運行機器學習實驗
- 應用機器學習過程
- 默認情況下可重現的機器學習結果
- 10個實踐應用機器學習的標準數據集
- 簡單的三步法到最佳機器學習算法
- 打擊機器學習數據集中不平衡類的8種策略
- 模型表現不匹配問題(以及如何處理)
- 黑箱機器學習的誘惑陷阱
- 如何培養最終的機器學習模型
- 使用探索性數據分析了解您的問題并獲得更好的結果
- 什么是數據挖掘和KDD
- 為什么One-Hot在機器學習中編碼數據?
- 為什么你應該在你的機器學習問題上進行抽樣檢查算法
- 所以,你正在研究機器學習問題......
- Machine Learning Mastery Keras 深度學習教程
- Keras 中神經網絡模型的 5 步生命周期
- 在 Python 迷你課程中應用深度學習
- Keras 深度學習庫的二元分類教程
- 如何用 Keras 構建多層感知器神經網絡模型
- 如何在 Keras 中檢查深度學習模型
- 10 個用于 Amazon Web Services 深度學習的命令行秘籍
- 機器學習卷積神經網絡的速成課程
- 如何在 Python 中使用 Keras 進行深度學習的度量
- 深度學習書籍
- 深度學習課程
- 你所知道的深度學習是一種謊言
- 如何設置 Amazon AWS EC2 GPU 以訓練 Keras 深度學習模型(分步)
- 神經網絡中批量和迭代之間的區別是什么?
- 在 Keras 展示深度學習模型訓練歷史
- 基于 Keras 的深度學習模型中的dropout正則化
- 評估 Keras 中深度學習模型的表現
- 如何評價深度學習模型的技巧
- 小批量梯度下降的簡要介紹以及如何配置批量大小
- 在 Keras 中獲得深度學習幫助的 9 種方法
- 如何使用 Keras 在 Python 中網格搜索深度學習模型的超參數
- 用 Keras 在 Python 中使用卷積神經網絡進行手寫數字識別
- 如何用 Keras 進行預測
- 用 Keras 進行深度學習的圖像增強
- 8 個深度學習的鼓舞人心的應用
- Python 深度學習庫 Keras 簡介
- Python 深度學習庫 TensorFlow 簡介
- Python 深度學習庫 Theano 簡介
- 如何使用 Keras 函數式 API 進行深度學習
- Keras 深度學習庫的多類分類教程
- 多層感知器神經網絡速成課程
- 基于卷積神經網絡的 Keras 深度學習庫中的目標識別
- 流行的深度學習庫
- 用深度學習預測電影評論的情感
- Python 中的 Keras 深度學習庫的回歸教程
- 如何使用 Keras 獲得可重現的結果
- 如何在 Linux 服務器上運行深度學習實驗
- 保存并加載您的 Keras 深度學習模型
- 用 Keras 逐步開發 Python 中的第一個神經網絡
- 用 Keras 理解 Python 中的有狀態 LSTM 循環神經網絡
- 在 Python 中使用 Keras 深度學習模型和 Scikit-Learn
- 如何使用預訓練的 VGG 模型對照片中的物體進行分類
- 在 Python 和 Keras 中對深度學習模型使用學習率調度
- 如何在 Keras 中可視化深度學習神經網絡模型
- 什么是深度學習?
- 何時使用 MLP,CNN 和 RNN 神經網絡
- 為什么用隨機權重初始化神經網絡?
- Machine Learning Mastery 深度學習 NLP 教程
- 深度學習在自然語言處理中的 7 個應用
- 如何實現自然語言處理的波束搜索解碼器
- 深度學習文檔分類的最佳實踐
- 關于自然語言處理的熱門書籍
- 在 Python 中計算文本 BLEU 分數的溫和介紹
- 使用編碼器 - 解碼器模型的用于字幕生成的注入和合并架構
- 如何用 Python 清理機器學習的文本
- 如何配置神經機器翻譯的編碼器 - 解碼器模型
- 如何開始深度學習自然語言處理(7 天迷你課程)
- 自然語言處理的數據集
- 如何開發一種深度學習的詞袋模型來預測電影評論情感
- 深度學習字幕生成模型的溫和介紹
- 如何在 Keras 中定義神經機器翻譯的編碼器 - 解碼器序列 - 序列模型
- 如何利用小實驗在 Keras 中開發字幕生成模型
- 如何從頭開發深度學習圖片標題生成器
- 如何在 Keras 中開發基于字符的神經語言模型
- 如何開發用于情感分析的 N-gram 多通道卷積神經網絡
- 如何從零開始開發神經機器翻譯系統
- 如何在 Python 中用 Keras 開發基于單詞的神經語言模型
- 如何開發一種預測電影評論情感的詞嵌入模型
- 如何使用 Gensim 在 Python 中開發詞嵌入
- 用于文本摘要的編碼器 - 解碼器深度學習模型
- Keras 中文本摘要的編碼器 - 解碼器模型
- 用于神經機器翻譯的編碼器 - 解碼器循環神經網絡模型
- 淺談詞袋模型
- 文本摘要的溫和介紹
- 編碼器 - 解碼器循環神經網絡中的注意力如何工作
- 如何利用深度學習自動生成照片的文本描述
- 如何開發一個單詞級神經語言模型并用它來生成文本
- 淺談神經機器翻譯
- 什么是自然語言處理?
- 牛津自然語言處理深度學習課程
- 如何為機器翻譯準備法語到英語的數據集
- 如何為情感分析準備電影評論數據
- 如何為文本摘要準備新聞文章
- 如何準備照片標題數據集以訓練深度學習模型
- 如何使用 Keras 為深度學習準備文本數據
- 如何使用 scikit-learn 為機器學習準備文本數據
- 自然語言處理神經網絡模型入門
- 對自然語言處理的深度學習的承諾
- 在 Python 中用 Keras 進行 LSTM 循環神經網絡的序列分類
- 斯坦福自然語言處理深度學習課程評價
- 統計語言建模和神經語言模型的簡要介紹
- 使用 Keras 在 Python 中進行 LSTM 循環神經網絡的文本生成
- 淺談機器學習中的轉換
- 如何使用 Keras 將詞嵌入層用于深度學習
- 什么是用于文本的詞嵌入
- Machine Learning Mastery 深度學習時間序列教程
- 如何開發人類活動識別的一維卷積神經網絡模型
- 人類活動識別的深度學習模型
- 如何評估人類活動識別的機器學習算法
- 時間序列預測的多層感知器網絡探索性配置
- 比較經典和機器學習方法進行時間序列預測的結果
- 如何通過深度學習快速獲得時間序列預測的結果
- 如何利用 Python 處理序列預測問題中的缺失時間步長
- 如何建立預測大氣污染日的概率預測模型
- 如何開發一種熟練的機器學習時間序列預測模型
- 如何構建家庭用電自回歸預測模型
- 如何開發多步空氣污染時間序列預測的自回歸預測模型
- 如何制定多站點多元空氣污染時間序列預測的基線預測
- 如何開發時間序列預測的卷積神經網絡模型
- 如何開發卷積神經網絡用于多步時間序列預測
- 如何開發單變量時間序列預測的深度學習模型
- 如何開發 LSTM 模型用于家庭用電的多步時間序列預測
- 如何開發 LSTM 模型進行時間序列預測
- 如何開發多元多步空氣污染時間序列預測的機器學習模型
- 如何開發多層感知器模型進行時間序列預測
- 如何開發人類活動識別時間序列分類的 RNN 模型
- 如何開始深度學習的時間序列預測(7 天迷你課程)
- 如何網格搜索深度學習模型進行時間序列預測
- 如何對單變量時間序列預測的網格搜索樸素方法
- 如何在 Python 中搜索 SARIMA 模型超參數用于時間序列預測
- 如何在 Python 中進行時間序列預測的網格搜索三次指數平滑
- 一個標準的人類活動識別問題的溫和介紹
- 如何加載和探索家庭用電數據
- 如何加載,可視化和探索復雜的多變量多步時間序列預測數據集
- 如何從智能手機數據模擬人類活動
- 如何根據環境因素預測房間占用率
- 如何使用腦波預測人眼是開放還是閉合
- 如何在 Python 中擴展長短期內存網絡的數據
- 如何使用 TimeseriesGenerator 進行 Keras 中的時間序列預測
- 基于機器學習算法的室內運動時間序列分類
- 用于時間序列預測的狀態 LSTM 在線學習的不穩定性
- 用于罕見事件時間序列預測的 LSTM 模型體系結構
- 用于時間序列預測的 4 種通用機器學習數據變換
- Python 中長短期記憶網絡的多步時間序列預測
- 家庭用電機器學習的多步時間序列預測
- Keras 中 LSTM 的多變量時間序列預測
- 如何開發和評估樸素的家庭用電量預測方法
- 如何為長短期記憶網絡準備單變量時間序列數據
- 循環神經網絡在時間序列預測中的應用
- 如何在 Python 中使用差異變換刪除趨勢和季節性
- 如何在 LSTM 中種子狀態用于 Python 中的時間序列預測
- 使用 Python 進行時間序列預測的有狀態和無狀態 LSTM
- 長短時記憶網絡在時間序列預測中的適用性
- 時間序列預測問題的分類
- Python 中長短期記憶網絡的時間序列預測
- 基于 Keras 的 Python 中 LSTM 循環神經網絡的時間序列預測
- Keras 中深度學習的時間序列預測
- 如何用 Keras 調整 LSTM 超參數進行時間序列預測
- 如何在時間序列預測訓練期間更新 LSTM 網絡
- 如何使用 LSTM 網絡的 Dropout 進行時間序列預測
- 如何使用 LSTM 網絡中的特征進行時間序列預測
- 如何在 LSTM 網絡中使用時間序列進行時間序列預測
- 如何利用 LSTM 網絡進行權重正則化進行時間序列預測
- Machine Learning Mastery 線性代數教程
- 機器學習數學符號的基礎知識
- 用 NumPy 陣列輕松介紹廣播
- 如何從 Python 中的 Scratch 計算主成分分析(PCA)
- 用于編碼器審查的計算線性代數
- 10 機器學習中的線性代數示例
- 線性代數的溫和介紹
- 用 NumPy 輕松介紹 Python 中的 N 維數組
- 機器學習向量的溫和介紹
- 如何在 Python 中為機器學習索引,切片和重塑 NumPy 數組
- 機器學習的矩陣和矩陣算法簡介
- 溫和地介紹機器學習的特征分解,特征值和特征向量
- NumPy 對預期價值,方差和協方差的簡要介紹
- 機器學習矩陣分解的溫和介紹
- 用 NumPy 輕松介紹機器學習的張量
- 用于機器學習的線性代數中的矩陣類型簡介
- 用于機器學習的線性代數備忘單
- 線性代數的深度學習
- 用于機器學習的線性代數(7 天迷你課程)
- 機器學習的線性代數
- 機器學習矩陣運算的溫和介紹
- 線性代數評論沒有廢話指南
- 學習機器學習線性代數的主要資源
- 淺談機器學習的奇異值分解
- 如何用線性代數求解線性回歸
- 用于機器學習的稀疏矩陣的溫和介紹
- 機器學習中向量規范的溫和介紹
- 學習線性代數用于機器學習的 5 個理由
- Machine Learning Mastery LSTM 教程
- Keras中長短期記憶模型的5步生命周期
- 長短時記憶循環神經網絡的注意事項
- CNN長短期記憶網絡
- 逆向神經網絡中的深度學習速成課程
- 可變長度輸入序列的數據準備
- 如何用Keras開發用于Python序列分類的雙向LSTM
- 如何開發Keras序列到序列預測的編碼器 - 解碼器模型
- 如何診斷LSTM模型的過度擬合和欠擬合
- 如何開發一種編碼器 - 解碼器模型,注重Keras中的序列到序列預測
- 編碼器 - 解碼器長短期存儲器網絡
- 神經網絡中爆炸梯度的溫和介紹
- 對時間反向傳播的溫和介紹
- 生成長短期記憶網絡的溫和介紹
- 專家對長短期記憶網絡的簡要介紹
- 在序列預測問題上充分利用LSTM
- 編輯器 - 解碼器循環神經網絡全局注意的溫和介紹
- 如何利用長短時記憶循環神經網絡處理很長的序列
- 如何在Python中對一個熱編碼序列數據
- 如何使用編碼器 - 解碼器LSTM來回顯隨機整數序列
- 具有注意力的編碼器 - 解碼器RNN體系結構的實現模式
- 學習使用編碼器解碼器LSTM循環神經網絡添加數字
- 如何學習長短時記憶循環神經網絡回聲隨機整數
- 具有Keras的長短期記憶循環神經網絡的迷你課程
- LSTM自動編碼器的溫和介紹
- 如何用Keras中的長短期記憶模型進行預測
- 用Python中的長短期內存網絡演示內存
- 基于循環神經網絡的序列預測模型的簡要介紹
- 深度學習的循環神經網絡算法之旅
- 如何重塑Keras中長短期存儲網絡的輸入數據
- 了解Keras中LSTM的返回序列和返回狀態之間的差異
- RNN展開的溫和介紹
- 5學習LSTM循環神經網絡的簡單序列預測問題的例子
- 使用序列進行預測
- 堆疊長短期內存網絡
- 什么是教師強制循環神經網絡?
- 如何在Python中使用TimeDistributed Layer for Long Short-Term Memory Networks
- 如何準備Keras中截斷反向傳播的序列預測
- 如何在使用LSTM進行訓練和預測時使用不同的批量大小
- Machine Learning Mastery 機器學習算法教程
- 機器學習算法之旅
- 用于機器學習的裝袋和隨機森林集合算法
- 從頭開始實施機器學習算法的好處
- 更好的樸素貝葉斯:從樸素貝葉斯算法中獲取最多的12個技巧
- 機器學習的提升和AdaBoost
- 選擇機器學習算法:Microsoft Azure的經驗教訓
- 機器學習的分類和回歸樹
- 什么是機器學習中的混淆矩陣
- 如何使用Python從頭開始創建算法測試工具
- 通過創建機器學習算法的目標列表來控制
- 從頭開始停止編碼機器學習算法
- 在實現機器學習算法時,不要從開源代碼開始
- 不要使用隨機猜測作為基線分類器
- 淺談機器學習中的概念漂移
- 溫和介紹機器學習中的偏差 - 方差權衡
- 機器學習的梯度下降
- 機器學習算法如何工作(他們學習輸入到輸出的映射)
- 如何建立機器學習算法的直覺
- 如何實現機器學習算法
- 如何研究機器學習算法行為
- 如何學習機器學習算法
- 如何研究機器學習算法
- 如何研究機器學習算法
- 如何在Python中從頭開始實現反向傳播算法
- 如何用Python從頭開始實現Bagging
- 如何用Python從頭開始實現基線機器學習算法
- 如何在Python中從頭開始實現決策樹算法
- 如何用Python從頭開始實現學習向量量化
- 如何利用Python從頭開始隨機梯度下降實現線性回歸
- 如何利用Python從頭開始隨機梯度下降實現Logistic回歸
- 如何用Python從頭開始實現機器學習算法表現指標
- 如何在Python中從頭開始實現感知器算法
- 如何在Python中從零開始實現隨機森林
- 如何在Python中從頭開始實現重采樣方法
- 如何用Python從頭開始實現簡單線性回歸
- 如何用Python從頭開始實現堆棧泛化(Stacking)
- K-Nearest Neighbors for Machine Learning
- 學習機器學習的向量量化
- 機器學習的線性判別分析
- 機器學習的線性回歸
- 使用梯度下降進行機器學習的線性回歸教程
- 如何在Python中從頭開始加載機器學習數據
- 機器學習的Logistic回歸
- 機器學習的Logistic回歸教程
- 機器學習算法迷你課程
- 如何在Python中從頭開始實現樸素貝葉斯
- 樸素貝葉斯機器學習
- 樸素貝葉斯機器學習教程
- 機器學習算法的過擬合和欠擬合
- 參數化和非參數機器學習算法
- 理解任何機器學習算法的6個問題
- 在機器學習中擁抱隨機性
- 如何使用Python從頭開始擴展機器學習數據
- 機器學習的簡單線性回歸教程
- 有監督和無監督的機器學習算法
- 用于機器學習的支持向量機
- 在沒有數學背景的情況下理解機器學習算法的5種技術
- 最好的機器學習算法
- 教程從頭開始在Python中實現k-Nearest Neighbors
- 通過從零開始實現它們來理解機器學習算法(以及繞過壞代碼的策略)
- 使用隨機森林:在121個數據集上測試179個分類器
- 為什么從零開始實現機器學習算法
- Machine Learning Mastery 機器學習入門教程
- 機器學習入門的四個步驟:初學者入門與實踐的自上而下策略
- 你應該培養的 5 個機器學習領域
- 一種選擇機器學習算法的數據驅動方法
- 機器學習中的分析與數值解
- 應用機器學習是一種精英政治
- 機器學習的基本概念
- 如何成為數據科學家
- 初學者如何在機器學習中弄錯
- 機器學習的最佳編程語言
- 構建機器學習組合
- 機器學習中分類與回歸的區別
- 評估自己作為數據科學家并利用結果建立驚人的數據科學團隊
- 探索 Kaggle 大師的方法論和心態:對 Diogo Ferreira 的采訪
- 擴展機器學習工具并展示掌握
- 通過尋找地標開始機器學習
- 溫和地介紹預測建模
- 通過提供結果在機器學習中獲得夢想的工作
- 如何開始機器學習:自學藍圖
- 開始并在機器學習方面取得進展
- 應用機器學習的 Hello World
- 初學者如何使用小型項目開始機器學習并在 Kaggle 上進行競爭
- 我如何開始機器學習? (簡短版)
- 我是如何開始機器學習的
- 如何在機器學習中取得更好的成績
- 如何從在銀行工作到擔任 Target 的高級數據科學家
- 如何學習任何機器學習工具
- 使用小型目標項目深入了解機器學習工具
- 獲得付費申請機器學習
- 映射機器學習工具的景觀
- 機器學習開發環境
- 機器學習金錢
- 程序員的機器學習
- 機器學習很有意思
- 機器學習是 Kaggle 比賽
- 機器學習現在很受歡迎
- 機器學習掌握方法
- 機器學習很重要
- 機器學習 Q&amp; A:概念漂移,更好的結果和學習更快
- 缺乏自學機器學習的路線圖
- 機器學習很重要
- 快速了解任何機器學習工具(即使您是初學者)
- 機器學習工具
- 找到你的機器學習部落
- 機器學習在一年
- 通過競爭一致的大師 Kaggle
- 5 程序員在機器學習中開始犯錯誤
- 哲學畢業生到機器學習從業者(Brian Thomas 采訪)
- 機器學習入門的實用建議
- 實用機器學習問題
- 使用來自 UCI 機器學習庫的數據集練習機器學習
- 使用秘籍的任何機器學習工具快速啟動
- 程序員可以進入機器學習
- 程序員應該進入機器學習
- 項目焦點:Shashank Singh 的人臉識別
- 項目焦點:使用 Mahout 和 Konstantin Slisenko 進行堆棧交換群集
- 機器學習自學指南
- 4 個自學機器學習項目
- álvaroLemos 如何在數據科學團隊中獲得機器學習實習
- 如何思考機器學習
- 現實世界機器學習問題之旅
- 有關機器學習的有用知識
- 如果我沒有學位怎么辦?
- 如果我不是一個優秀的程序員怎么辦?
- 如果我不擅長數學怎么辦?
- 為什么機器學習算法會處理以前從未見過的數據?
- 是什么阻礙了你的機器學習目標?
- 什么是機器學習?
- 機器學習適合哪里?
- 為什么要進入機器學習?
- 研究對您來說很重要的機器學習問題
- 你這樣做是錯的。為什么機器學習不必如此困難
- Machine Learning Mastery Sklearn 教程
- Scikit-Learn 的溫和介紹:Python 機器學習庫
- 使用 Python 管道和 scikit-learn 自動化機器學習工作流程
- 如何以及何時使用帶有 scikit-learn 的校準分類模型
- 如何比較 Python 中的機器學習算法與 scikit-learn
- 用于機器學習開發人員的 Python 崩潰課程
- 用 scikit-learn 在 Python 中集成機器學習算法
- 使用重采樣評估 Python 中機器學習算法的表現
- 使用 Scikit-Learn 在 Python 中進行特征選擇
- Python 中機器學習的特征選擇
- 如何使用 scikit-learn 在 Python 中生成測試數據集
- scikit-learn 中的機器學習算法秘籍
- 如何使用 Python 處理丟失的數據
- 如何開始使用 Python 進行機器學習
- 如何使用 Scikit-Learn 在 Python 中加載數據
- Python 中概率評分方法的簡要介紹
- 如何用 Scikit-Learn 調整算法參數
- 如何在 Mac OS X 上安裝 Python 3 環境以進行機器學習和深度學習
- 使用 scikit-learn 進行機器學習簡介
- 從 shell 到一本帶有 Fernando Perez 單一工具的書的 IPython
- 如何使用 Python 3 為機器學習開發創建 Linux 虛擬機
- 如何在 Python 中加載機器學習數據
- 您在 Python 中的第一個機器學習項目循序漸進
- 如何使用 scikit-learn 進行預測
- 用于評估 Python 中機器學習算法的度量標準
- 使用 Pandas 為 Python 中的機器學習準備數據
- 如何使用 Scikit-Learn 為 Python 機器學習準備數據
- 項目焦點:使用 Artem Yankov 在 Python 中進行事件推薦
- 用于機器學習的 Python 生態系統
- Python 是應用機器學習的成長平臺
- Python 機器學習書籍
- Python 機器學習迷你課程
- 使用 Pandas 快速和骯臟的數據分析
- 使用 Scikit-Learn 重新調整 Python 中的機器學習數據
- 如何以及何時使用 ROC 曲線和精確調用曲線進行 Python 分類
- 使用 scikit-learn 在 Python 中保存和加載機器學習模型
- scikit-learn Cookbook 書評
- 如何使用 Anaconda 為機器學習和深度學習設置 Python 環境
- 使用 scikit-learn 在 Python 中進行 Spot-Check 分類機器學習算法
- 如何在 Python 中開發可重復使用的抽樣檢查算法框架
- 使用 scikit-learn 在 Python 中進行 Spot-Check 回歸機器學習算法
- 使用 Python 中的描述性統計來了解您的機器學習數據
- 使用 OpenCV,Python 和模板匹配來播放“哪里是 Waldo?”
- 使用 Pandas 在 Python 中可視化機器學習數據
- Machine Learning Mastery 統計學教程
- 淺談計算正態匯總統計量
- 非參數統計的溫和介紹
- Python中常態測試的溫和介紹
- 淺談Bootstrap方法
- 淺談機器學習的中心極限定理
- 淺談機器學習中的大數定律
- 機器學習的所有統計數據
- 如何計算Python中機器學習結果的Bootstrap置信區間
- 淺談機器學習的Chi-Squared測試
- 機器學習的置信區間
- 隨機化在機器學習中解決混雜變量的作用
- 機器學習中的受控實驗
- 機器學習統計學速成班
- 統計假設檢驗的關鍵值以及如何在Python中計算它們
- 如何在機器學習中談論數據(統計學和計算機科學術語)
- Python中數據可視化方法的簡要介紹
- Python中效果大小度量的溫和介紹
- 估計隨機機器學習算法的實驗重復次數
- 機器學習評估統計的溫和介紹
- 如何計算Python中的非參數秩相關性
- 如何在Python中計算數據的5位數摘要
- 如何在Python中從頭開始編寫學生t檢驗
- 如何在Python中生成隨機數
- 如何轉換數據以更好地擬合正態分布
- 如何使用相關來理解變量之間的關系
- 如何使用統計信息識別數據中的異常值
- 用于Python機器學習的隨機數生成器簡介
- k-fold交叉驗證的溫和介紹
- 如何計算McNemar的比較兩種機器學習量詞的測試
- Python中非參數統計顯著性測試簡介
- 如何在Python中使用參數統計顯著性測試
- 機器學習的預測間隔
- 應用統計學與機器學習的密切關系
- 如何使用置信區間報告分類器表現
- 統計數據分布的簡要介紹
- 15 Python中的統計假設檢驗(備忘單)
- 統計假設檢驗的溫和介紹
- 10如何在機器學習項目中使用統計方法的示例
- Python中統計功效和功耗分析的簡要介紹
- 統計抽樣和重新抽樣的簡要介紹
- 比較機器學習算法的統計顯著性檢驗
- 機器學習中統計容差區間的溫和介紹
- 機器學習統計書籍
- 評估機器學習模型的統計數據
- 機器學習統計(7天迷你課程)
- 用于機器學習的簡明英語統計
- 如何使用統計顯著性檢驗來解釋機器學習結果
- 什么是統計(為什么它在機器學習中很重要)?
- Machine Learning Mastery 時間序列入門教程
- 如何在 Python 中為時間序列預測創建 ARIMA 模型
- 用 Python 進行時間序列預測的自回歸模型
- 如何回溯機器學習模型的時間序列預測
- Python 中基于時間序列數據的基本特征工程
- R 的時間序列預測熱門書籍
- 10 挑戰機器學習時間序列預測問題
- 如何將時間序列轉換為 Python 中的監督學習問題
- 如何將時間序列數據分解為趨勢和季節性
- 如何用 ARCH 和 GARCH 模擬波動率進行時間序列預測
- 如何將時間序列數據集與 Python 區分開來
- Python 中時間序列預測的指數平滑的溫和介紹
- 用 Python 進行時間序列預測的特征選擇
- 淺談自相關和部分自相關
- 時間序列預測的 Box-Jenkins 方法簡介
- 用 Python 簡要介紹時間序列的時間序列預測
- 如何使用 Python 網格搜索 ARIMA 模型超參數
- 如何在 Python 中加載和探索時間序列數據
- 如何使用 Python 對 ARIMA 模型進行手動預測
- 如何用 Python 進行時間序列預測的預測
- 如何使用 Python 中的 ARIMA 進行樣本外預測
- 如何利用 Python 模擬殘差錯誤來糾正時間序列預測
- 使用 Python 進行數據準備,特征工程和時間序列預測的移動平均平滑
- 多步時間序列預測的 4 種策略
- 如何在 Python 中規范化和標準化時間序列數據
- 如何利用 Python 進行時間序列預測的基線預測
- 如何使用 Python 對時間序列預測數據進行功率變換
- 用于時間序列預測的 Python 環境
- 如何重構時間序列預測問題
- 如何使用 Python 重新采樣和插值您的時間序列數據
- 用 Python 編寫 SARIMA 時間序列預測
- 如何在 Python 中保存 ARIMA 時間序列預測模型
- 使用 Python 進行季節性持久性預測
- 基于 ARIMA 的 Python 歷史規模敏感性預測技巧分析
- 簡單的時間序列預測模型進行測試,這樣你就不會欺騙自己
- 標準多變量,多步驟和多站點時間序列預測問題
- 如何使用 Python 檢查時間序列數據是否是固定的
- 使用 Python 進行時間序列數據可視化
- 7 個機器學習的時間序列數據集
- 時間序列預測案例研究與 Python:波士頓每月武裝搶劫案
- Python 的時間序列預測案例研究:巴爾的摩的年度用水量
- 使用 Python 進行時間序列預測研究:法國香檳的月銷售額
- 使用 Python 的置信區間理解時間序列預測不確定性
- 11 Python 中的經典時間序列預測方法(備忘單)
- 使用 Python 進行時間序列預測表現測量
- 使用 Python 7 天迷你課程進行時間序列預測
- 時間序列預測作為監督學習
- 什么是時間序列預測?
- 如何使用 Python 識別和刪除時間序列數據的季節性
- 如何在 Python 中使用和刪除時間序列數據中的趨勢信息
- 如何在 Python 中調整 ARIMA 參數
- 如何用 Python 可視化時間序列殘差預測錯誤
- 白噪聲時間序列與 Python
- 如何通過時間序列預測項目
- Machine Learning Mastery XGBoost 教程
- 通過在 Python 中使用 XGBoost 提前停止來避免過度擬合
- 如何在 Python 中調優 XGBoost 的多線程支持
- 如何配置梯度提升算法
- 在 Python 中使用 XGBoost 進行梯度提升的數據準備
- 如何使用 scikit-learn 在 Python 中開發您的第一個 XGBoost 模型
- 如何在 Python 中使用 XGBoost 評估梯度提升模型
- 在 Python 中使用 XGBoost 的特征重要性和特征選擇
- 淺談機器學習的梯度提升算法
- 應用機器學習的 XGBoost 簡介
- 如何在 macOS 上為 Python 安裝 XGBoost
- 如何在 Python 中使用 XGBoost 保存梯度提升模型
- 從梯度提升開始,比較 165 個數據集上的 13 種算法
- 在 Python 中使用 XGBoost 和 scikit-learn 進行隨機梯度提升
- 如何使用 Amazon Web Services 在云中訓練 XGBoost 模型
- 在 Python 中使用 XGBoost 調整梯度提升的學習率
- 如何在 Python 中使用 XGBoost 調整決策樹的數量和大小
- 如何在 Python 中使用 XGBoost 可視化梯度提升決策樹
- 在 Python 中開始使用 XGBoost 的 7 步迷你課程