# 基于機器學習算法的室內運動時間序列分類
> 原文: [https://machinelearningmastery.com/indoor-movement-time-series-classification-with-machine-learning-algorithms/](https://machinelearningmastery.com/indoor-movement-time-series-classification-with-machine-learning-algorithms/)
室內運動預測涉及使用無線傳感器強度數據來預測建筑物內的對象的位置和運動。
這是一個具有挑戰性的問題,因為沒有直接的分析模型將來自多個傳感器的信號強度數據的可變長度軌跡轉換為用戶行為。
'_ 室內用戶移動 _'數據集是標準且免費提供的時間序列分類問題。
在本教程中,您將發現室內運動預測時間序列分類問題以及如何設計功能并評估問題的機器學習算法。
完成本教程后,您將了解:
* 基于傳感器強度預測房間運動的時間序列分類問題。
* 如何調查數據以便更好地理解問題以及如何從原始數據中設計特征以進行預測建模。
* 如何檢查一套分類算法并調整一種算法以進一步提高問題的表現。
讓我們開始吧。
* **更新 Sept / 2018** :添加了指向數據集鏡像的鏈接。

室內運動時間序列分類與機器學習算法
照片由 [Nola Tularosa](https://www.flickr.com/photos/nolatularosa/3238977118/) ,保留一些權利。
## 教程概述
本教程分為五個部分;他們是:
1. 室內用戶運動預測
2. 室內運動預測數據集
3. 模型評估
4. 數據準備
5. 算法抽查
## 室內用戶運動預測
“_ 室內用戶移動 _”預測問題涉及基于由環境中的無線檢測器測量的信號強度的變化來確定個體是否已經在房間之間移動。
收集數據集并由 Davide Bacciu 等人提供。來自意大利比薩大學的 2011 年論文“[通過油藏計算](https://pdfs.semanticscholar.org/40c2/393e1874c3fd961fdfff02402c24ccf1c3d7.pdf#page=13)預測異構室內環境中的用戶運動”作為探索一種類似于反復神經網絡稱為“油藏計算”的方法論的數據集。 “
問題是預測室內用戶定位和運動模式的更普遍問題的特殊情況。
通過在環境中定位四個無線傳感器并在主題上定位一個來收集數據。當四個無線傳感器檢測到并記錄傳感器強度的時間序列時,受試者穿過環境。
結果是由可變長度時間序列組成的數據集,其中四個變量描述通過明確定義的靜態環境的軌跡,以及運動是否導致環境中的主題更衣室的分類。
這是一個具有挑戰性的問題,因為沒有明顯和通用的方法將信號強度數據與環境中的主題位置相關聯。
> RSS 與被跟蹤對象的位置之間的關系不能容易地形成分析模型,因為它強烈依賴于環境的特征以及所涉及的無線設備。一世
- [通過油藏計算預測異構室內環境中的用戶移動](https://pdfs.semanticscholar.org/40c2/393e1874c3fd961fdfff02402c24ccf1c3d7.pdf#page=13),2011。
在受控的實驗條件下收集數據。
傳感器被放置在三對兩個連接的房間中,其中包含典型的辦公家具。兩個傳感器放置在兩個房間的每個房間的角落中,并且受試者走過房間中的六條預定路徑中的一條。預測是在每條路徑的某個點上進行的,這可能會也可能不會導致房間的變化。
下面的動畫片清楚地表明了傳感器位置(A1-A4),可能行走的六條可能路徑,以及將進行預測的兩個點(M)。

兩個房間概述,傳感器位置和 6 個預定義路徑。
取自“通過油藏計算預測異構室內環境中的用戶移動”。
從三對兩個房間收集三個數據集,其中走路徑并進行傳感器測量,稱為數據集 1,數據集 2 和數據集 3。
下表摘自論文,總結了三個數據集中每個數據集中走的路徑數,房間更改總數和非房間更改(類標簽)以及時間序列輸入的長度。

從三對兩個房間收集的傳感器數據摘要。
取自“通過油藏計算預測異構室內環境中的用戶移動”。
從技術上講,數據由多變量時間序列輸入和分類輸出組成,可以描述為時間序列分類問題。
> 來自四個錨的 RSS 值被組織成對應于從起始點到標記 M 的軌跡測量的不同長度的序列。目標分類標簽與每個輸入序列相關聯以指示用戶是否將要改變其位置(房間)或不。
- [通過油藏計算預測異構室內環境中的用戶移動](https://pdfs.semanticscholar.org/40c2/393e1874c3fd961fdfff02402c24ccf1c3d7.pdf#page=13),2011。
## 室內運動預測數據集
數據集可從 UCI 機器學習庫免費獲得:
* [來自 RSS 數據集的室內用戶移動預測,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Indoor+User+Movement+Prediction+from+RSS+data)
如果上述網站出現故障(可能發生),這里是指向數據集鏡像的直接鏈接:
* [IndoorMovement.zip](https://raw.githubusercontent.com/jbrownlee/Datasets/master/IndoorMovement.zip)
數據可以下載為包含以下顯著文件的.zip 文件:
* **dataset / MovementAAL_RSS _ ???。csv** 每個動作的 RSS 曲線,文件名中的'???'標記從 1 到 311 的曲目編號。
* **dataset / MovementAAL_target.csv** 跟蹤號到輸出類值或目標的映射。
* **groups / MovementAAL_DatasetGroup.csv** 跟蹤編號到數據集組 1,2 或 3 的映射,標記記錄跟蹤的一對房間。
* **groups / MovementAAL_Paths.csv** 跟蹤號碼到路徑類型 1-6 的映射,在上面的卡通圖中標記。
提供的數據已經標準化。
具體來說,每個輸入變量被標準化為每個數據集(一對房間)的范圍[-1,1],輸出類變量標記為-1 表示房間之間沒有過渡,而+1 表示通過房間過渡。
> [...]放置數據包括 4 維 RSS 測量的時間序列(NU = 4),對應于每個數據集獨立地在[-1,1]范圍內歸一化的 4 個錨點[...]
- [通過油藏計算預測異構室內環境中的用戶移動](https://pdfs.semanticscholar.org/40c2/393e1874c3fd961fdfff02402c24ccf1c3d7.pdf#page=13),2011。
如果預標準化分布差異很大,則在跨數據集組合觀察時,按數據集縮放數據可能(或可能不)引入額外的挑戰。
給定跟蹤文??件中的一個跟蹤的時間序列按時間順序提供,其中一行記錄單個時間步的觀察結果。數據以 8Hz 記錄,這意味著數據中的八個時間步長經過了一秒的時鐘時間。
下面是一個跟蹤示例,取自' _dataset / MovementAAL_RSS_1.csv_ ',其輸出目標為'1'(發生房間轉換),來自第 1 組(第一對房間)和是路徑 1(房間之間從左到右的直射)。
```py
#RSS_anchor1, RSS_anchor2, RSS_anchor3, RSS_anchor4
-0.90476,-0.48,0.28571,0.3
-0.57143,-0.32,0.14286,0.3
-0.38095,-0.28,-0.14286,0.35
-0.28571,-0.2,-0.47619,0.35
-0.14286,-0.2,0.14286,-0.2
-0.14286,-0.2,0.047619,0
-0.14286,-0.16,-0.38095,0.2
-0.14286,-0.04,-0.61905,-0.2
-0.095238,-0.08,0.14286,-0.55
-0.047619,0.04,-0.095238,0.05
-0.19048,-0.04,0.095238,0.4
-0.095238,-0.04,-0.14286,0.35
-0.33333,-0.08,-0.28571,-0.2
-0.2381,0.04,0.14286,0.35
0,0.08,0.14286,0.05
-0.095238,0.04,0.095238,0.1
-0.14286,-0.2,0.14286,0.5
-0.19048,0.04,-0.42857,0.3
-0.14286,-0.08,-0.2381,0.15
-0.33333,0.16,-0.14286,-0.8
-0.42857,0.16,-0.28571,-0.1
-0.71429,0.16,-0.28571,0.2
-0.095238,-0.08,0.095238,0.35
-0.28571,0.04,0.14286,0.2
0,0.04,0.14286,0.1
0,0.04,-0.047619,-0.05
-0.14286,-0.6,-0.28571,-0.1
```
如第一篇論文所述,數據集以兩種特定方式(實驗設置或 ES)使用,以評估問題的預測模型,指定為 ES1 和 ES2。
* **ES1** :合并數據集 1 和 2,將其分為訓練(80%)和測試(20%)集以評估模型。
* **ES2** :合并用作訓練集的數據集 1 和 2(66%),數據集 3 用作測試集(34%)以評估模型。
ES1 案例評估模型以概括兩對已知房間內的移動,即具有已知幾何形狀的房間。 ES2 案例試圖推廣從兩個房間到第三個看不見的房間的運動:一個更難的問題。
2011 年的論文報告了 ES1 上大約 95%的分類準確率和 ES2 大約 89%的表現,經過對一套算法的一些測試后,我非常令人印象深刻。
## 加載和探索數據集
在本節中,我們將數據加載到內存中并使用摘要和可視化進行探索,以幫助更好地了解問題的建模方式。
首先,下載數據集并將下載的存檔解壓縮到當前工作目錄中。
### 加載數據集
目標,組和路徑文件可以直接作為 Pandas DataFrames 加載。
```py
# load mapping files
from pandas import read_csv
target_mapping = read_csv('dataset/MovementAAL_target.csv', header=0)
group_mapping = read_csv('groups/MovementAAL_DatasetGroup.csv', header=0)
paths_mapping = read_csv('groups/MovementAAL_Paths.csv', header=0)
```
信號強度曲線存儲在 _ 數據集/_ 目錄中的單獨文件中。
這些可以通過迭代目錄中的所有文件并直接加載序列來加載。因為每個序列都有一個可變長度(可變行數),我們可以為列表中的每個跟蹤存儲 NumPy 數組。
```py
# load sequences and targets into memory
from pandas import read_csv
from os import listdir
sequences = list()
directory = 'dataset'
target_mapping = None
for name in listdir(directory):
filename = directory + '/' + name
if filename.endswith('_target.csv'):
continue
df = read_csv(filename, header=0)
values = df.values
sequences.append(values)
```
我們可以將所有這些綁定到一個名為 _load_dataset()_ 的函數中,并將數據加載到內存中。
下面列出了完整的示例。
```py
# load user movement dataset into memory
from pandas import read_csv
from os import listdir
# return list of traces, and arrays for targets, groups and paths
def load_dataset(prefix=''):
grps_dir, data_dir = prefix+'groups/', prefix+'dataset/'
# load mapping files
targets = read_csv(data_dir + 'MovementAAL_target.csv', header=0)
groups = read_csv(grps_dir + 'MovementAAL_DatasetGroup.csv', header=0)
paths = read_csv(grps_dir + 'MovementAAL_Paths.csv', header=0)
# load traces
sequences = list()
target_mapping = None
for name in listdir(data_dir):
filename = data_dir + name
if filename.endswith('_target.csv'):
continue
df = read_csv(filename, header=0)
values = df.values
sequences.append(values)
return sequences, targets.values[:,1], groups.values[:,1], paths.values[:,1]
# load dataset
sequences, targets, groups, paths = load_dataset()
# summarize shape of the loaded data
print(len(sequences), targets.shape, groups.shape, paths.shape)
```
運行該示例加載數據并顯示已從磁盤正確加載 314 條跟蹤及其相關輸出(目標為-1 或+1),數據集編號(組為 1,2 或 3)和路徑編號(路徑為 1) -6)。
```py
314 (314,) (314,) (314,)
```
### 基本信息
我們現在可以仔細查看加載的數據,以更好地理解或確認我們對問題的理解。
我們從論文中了解到,數據集在兩個類別方面是合理平衡的。我們可以通過總結所有觀察的類別細分來證實這一點。
```py
# summarize class breakdown
class1,class2 = len(targets[targets==-1]), len(targets[targets==1])
print('Class=-1: %d %.3f%%' % (class1, class1/len(targets)*100))
print('Class=+1: %d %.3f%%' % (class2, class2/len(targets)*100))
```
接下來,我們可以通過繪制原始值的直方圖來查看四個錨點中每一個的傳感器強度值的分布。
這要求我們創建一個包含所有觀察行的數組,以便我們可以繪制每列的分布。 _vstack()_ NumPy 函數將為我們完成這項工作。
```py
# histogram for each anchor point
all_rows = vstack(sequences)
pyplot.figure()
variables = [0, 1, 2, 3]
for v in variables:
pyplot.subplot(len(variables), 1, v+1)
pyplot.hist(all_rows[:, v], bins=20)
pyplot.show()
```
最后,另一個有趣的方面是跟蹤長度的分布。
我們可以使用直方圖來總結這種分布。
```py
# histogram for trace lengths
trace_lengths = [len(x) for x in sequences]
pyplot.hist(trace_lengths, bins=50)
pyplot.show()
```
綜合這些,下面列出了加載和匯總數據的完整示例。
```py
# summarize simple information about user movement data
from os import listdir
from numpy import array
from numpy import vstack
from pandas import read_csv
from matplotlib import pyplot
# return list of traces, and arrays for targets, groups and paths
def load_dataset(prefix=''):
grps_dir, data_dir = prefix+'groups/', prefix+'dataset/'
# load mapping files
targets = read_csv(data_dir + 'MovementAAL_target.csv', header=0)
groups = read_csv(grps_dir + 'MovementAAL_DatasetGroup.csv', header=0)
paths = read_csv(grps_dir + 'MovementAAL_Paths.csv', header=0)
# load traces
sequences = list()
target_mapping = None
for name in listdir(data_dir):
filename = data_dir + name
if filename.endswith('_target.csv'):
continue
df = read_csv(filename, header=0)
values = df.values
sequences.append(values)
return sequences, targets.values[:,1], groups.values[:,1], paths.values[:,1]
# load dataset
sequences, targets, groups, paths = load_dataset()
# summarize class breakdown
class1,class2 = len(targets[targets==-1]), len(targets[targets==1])
print('Class=-1: %d %.3f%%' % (class1, class1/len(targets)*100))
print('Class=+1: %d %.3f%%' % (class2, class2/len(targets)*100))
# histogram for each anchor point
all_rows = vstack(sequences)
pyplot.figure()
variables = [0, 1, 2, 3]
for v in variables:
pyplot.subplot(len(variables), 1, v+1)
pyplot.hist(all_rows[:, v], bins=20)
pyplot.show()
# histogram for trace lengths
trace_lengths = [len(x) for x in sequences]
pyplot.hist(trace_lengths, bins=50)
pyplot.show()
```
首先運行該示例總結了觀察的類分布。
結果證實了我們對完整數據集的期望在兩個階段結果的觀察方面幾乎完全平衡。
```py
Class=-1: 156 49.682%
Class=+1: 158 50.318%
```
接下來,創建每個錨點的傳感器強度的直方圖,總結數據分布。
我們可以看到每個變量的分布接近正常,顯示出類似高斯的形狀。我們也可以看到圍繞-1 的觀測數據太多。這可能表示可以標記甚至從序列中過濾掉的通用“無強度”觀察結果。
調查分布是否按路徑類型甚至數據集編號更改可能會很有趣。

每個錨點的傳感器強度值的直方圖
最后,創建序列長度的直方圖。
我們可以看到長度在 25,40 和 60 之間的序列簇。我們還可以看到,如果我們想要修剪長序列,那么最長約 70 個時間步長可能是合適的。最小長度似乎是 19。

傳感器強度序列長度的直方圖
### 時間序列圖
我們正在處理時間序列數據,因此我們實際查看序列的一些示例非常重要。
我們可以按路徑對軌跡進行分組,并為每條路徑繪制一條軌跡的示例。期望不同路徑的跡線在某些方面可能看起來不同。
```py
# group sequences by paths
paths = [1,2,3,4,5,6]
seq_paths = dict()
for path in paths:
seq_paths[path] = [sequences[j] for j in range(len(paths)) if paths[j]==path]
# plot one example of a trace for each path
pyplot.figure()
for i in paths:
pyplot.subplot(len(paths), 1, i)
# line plot each variable
for j in [0, 1, 2, 3]:
pyplot.plot(seq_paths[i][0][:, j], label='Anchor ' + str(j+1))
pyplot.title('Path ' + str(i), y=0, loc='left')
pyplot.show()
```
我們還可以繪制一個跡線的每個系列以及線性回歸模型預測的趨勢。這將使該系列中的任何趨勢變得明顯。
我們可以使用 [lstsq()NumPy 函數](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html)對給定系列擬合線性回歸。
下面的函數 _regress()_ 將一系列作為單個變量,通過最小二乘擬合線性回歸模型,并預測每個時間步的輸出返回捕獲數據趨勢的序列。
```py
# fit a linear regression function and return the predicted values for the series
def regress(y):
# define input as the time step
X = array([i for i in range(len(y))]).reshape(len(y), 1)
# fit linear regression via least squares
b = lstsq(X, y)[0][0]
# predict trend on time step
yhat = b * X[:,0]
return yhat
```
我們可以使用該函數繪制單個跡線中每個變量的時間序列的趨勢。
```py
# plot series for a single trace with trend
seq = sequences[0]
variables = [0, 1, 2, 3]
pyplot.figure()
for i in variables:
pyplot.subplot(len(variables), 1, i+1)
# plot the series
pyplot.plot(seq[:,i])
# plot the trend
pyplot.plot(regress(seq[:,i]))
pyplot.show()
```
將所有這些結合在一起,下面列出了完整的示例。
```py
# plot series data
from os import listdir
from numpy import array
from numpy import vstack
from numpy.linalg import lstsq
from pandas import read_csv
from matplotlib import pyplot
# return list of traces, and arrays for targets, groups and paths
def load_dataset(prefix=''):
grps_dir, data_dir = prefix+'groups/', prefix+'dataset/'
# load mapping files
targets = read_csv(data_dir + 'MovementAAL_target.csv', header=0)
groups = read_csv(grps_dir + 'MovementAAL_DatasetGroup.csv', header=0)
paths = read_csv(grps_dir + 'MovementAAL_Paths.csv', header=0)
# load traces
sequences = list()
target_mapping = None
for name in listdir(data_dir):
filename = data_dir + name
if filename.endswith('_target.csv'):
continue
df = read_csv(filename, header=0)
values = df.values
sequences.append(values)
return sequences, targets.values[:,1], groups.values[:,1], paths.values[:,1]
# fit a linear regression function and return the predicted values for the series
def regress(y):
# define input as the time step
X = array([i for i in range(len(y))]).reshape(len(y), 1)
# fit linear regression via least squares
b = lstsq(X, y)[0][0]
# predict trend on time step
yhat = b * X[:,0]
return yhat
# load dataset
sequences, targets, groups, paths = load_dataset()
# group sequences by paths
paths = [1,2,3,4,5,6]
seq_paths = dict()
for path in paths:
seq_paths[path] = [sequences[j] for j in range(len(paths)) if paths[j]==path]
# plot one example of a trace for each path
pyplot.figure()
for i in paths:
pyplot.subplot(len(paths), 1, i)
# line plot each variable
for j in [0, 1, 2, 3]:
pyplot.plot(seq_paths[i][0][:, j], label='Anchor ' + str(j+1))
pyplot.title('Path ' + str(i), y=0, loc='left')
pyplot.show()
# plot series for a single trace with trend
seq = sequences[0]
variables = [0, 1, 2, 3]
pyplot.figure()
for i in variables:
pyplot.subplot(len(variables), 1, i+1)
# plot the series
pyplot.plot(seq[:,i])
# plot the trend
pyplot.plot(regress(seq[:,i]))
pyplot.show()
```
運行該示例將創建一個包含六個圖形的圖表,每個圖形對應六個路徑中的每一個。給定的圖顯示了單個跡線的線圖,其中包含跡線的四個變量,每個錨點一個。
也許所選擇的跡線代表每條路徑,也許不是。
我們可以看到一些明顯的差異:
* **隨時間變化的變量分組**。成對變量可以組合在一起,或者所有變量可以在給定時間組合在一起。
* **隨時間變化的趨勢**。變量聚集在一起向中間或分散到極端。
理想情況下,如果行為的這些變化是預測性的,則預測模型必須提取這些特征,或者將這些特征的摘要作為輸入呈現。

六條路徑中每條路徑的一條跡線(4 個變量)的線圖。
創建第二個圖,顯示單個跡線中四個系列的線圖以及趨勢線。
我們可以看到,至少對于這種跡線,當用戶在環境中移動時,傳感器強度數據有明顯的趨勢。這可能表明有機會在建模之前使數據靜止或使用跡線中的每個系列的趨勢(觀察或系數)作為預測模型的輸入。

具有趨勢線的單個跡線中的時間序列的線圖
## 模型評估
有許多方法可以擬合和評估此數據的模型。
鑒于類的平衡,分類準確性似乎是一個良好的首先評估指標。通過預測概率和探索 ROC 曲線上的閾值,可以在將來尋求更多的細微差別。
我看到使用這些數據的兩個主要主題:
* **同房**:一個房間里的痕跡訓練的模型可以預測那個房間里新痕跡的結果嗎?
* **不同的房間**:一個或兩個房間的痕跡訓練模型可以預測不同房間的新痕跡的結果嗎?
本文中描述并總結的 ES1 和 ES2 案例探討了這些問題,并提供了一個有用的起點。
首先,我們必須將加載的跟蹤和目標分成三組。
```py
# separate traces
seq1 = [sequences[i] for i in range(len(groups)) if groups[i]==1]
seq2 = [sequences[i] for i in range(len(groups)) if groups[i]==2]
seq3 = [sequences[i] for i in range(len(groups)) if groups[i]==3]
print(len(seq1),len(seq2),len(seq3))
# separate target
targets1 = [targets[i] for i in range(len(groups)) if groups[i]==1]
targets2 = [targets[i] for i in range(len(groups)) if groups[i]==2]
targets3 = [targets[i] for i in range(len(groups)) if groups[i]==3]
print(len(targets1),len(targets2),len(targets3))
```
在 ES1 的情況下,我們可以使用 k 折交叉驗證,其中 k = 5,使用與論文相同的比率,并且重復評估為評估提供了一些穩健性。
我們可以使用 scikit-learn 中的 [cross_val_score()函數](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html)來評估模型,然后計算得分的均值和標準差。
```py
# evaluate model for ES1
from numpy import mean
from numpy import std
from sklearn.model_selection import cross_val_score
...
scores = cross_val_score(model, X, y, scoring='accuracy', cv=5, n_jobs=-1)
m, s = mean(scores), std(scores)
```
在 ES2 的情況下,我們可以將模型擬合到數據集 1 和 2 上,并直接測試數據集 3 上的模型技能。
## 數據準備
輸入數據如何為預測問題構建靈活性。
我想到了兩種方法:
* **自動特征學習**。深度神經網絡能夠自動進行特征學習,而循環神經網絡可以直接支持多變量多步輸入數據。可以使用循環神經網絡,例如 LSTM 或 1D CNN。可以將序列填充為相同的長度,例如 70 個時間步長,并且可以使用掩蔽層來忽略填充的時間步長。
* **特色工程**。或者,可變長度序列可以概括為單個固定長度向量,并提供給標準機器學習模型用于預測。這需要仔細的特征工程,以便為模型提供足夠的跟蹤描述,以學習到輸出類的映射。
兩者都是有趣的方法。
作為第一步,我們將通過手動特征工程準備更傳統的固定長度向量輸入。
以下是有關可以包含在向量中的功能的一些想法:
* 變量的第一個,中間或最后 n 個觀測值。
* 變量的第一個,中間或最后 n 個觀測值的平均值或標準差。
* 最后和第 n 個觀察結果之間的差異
* 對變量的第一,中或最后 n 個觀察值的差異。
* 變量的所有,第一,中間或最后 n 個觀測值的線性回歸系數。
* 線性回歸預測變量的第一,中間或最后 n 個觀測值的趨勢。
此外,原始值可能不需要數據縮放,因為數據已經縮放到-1 到 1 的范圍。如果添加了不同單位的新功能,則可能需要縮放。
一些變量確實顯示出一些趨勢,這表明可能差異變量可能有助于梳理信號。
每個變量的分布接近高斯分布,因此一些算法可能會受益于標準化,甚至可能是 Box-Cox 變換。
## 算法抽查
在本節中,我們將對具有不同工程特性集的一套標準機器學習算法的默認配置進行抽查。
現場檢查是一種有用的技術,可快速清除輸入和輸出之間的映射是否有任何信號需要學習,因為大多數測試方法都會提取一些東西。該方法還可以提出可能值得進一步研究的方法。
缺點是每種方法都沒有給出它最好的機會(配置)以顯示它可以對問題做什么,這意味著任何進一步研究的方法都會受到第一批結果的偏見。
在這些測試中,我們將研究一套六種不同類型的算法,具體來說:
* Logistic 回歸。
* k-最近鄰居。
* 決策樹。
* 支持向量機。
* 隨機森林。
* 梯度增壓機。
我們將在關注時間序列變量末尾的特征上測試這些方法的默認配置,因為它們可能最能預測房間轉換是否會發生。
### 最后 _n_ 觀察
最后 _n_ 觀察結果可能預示著運動是否會導致房間過渡。
跟蹤數據中最小的時間步長為 19,因此,我們將使用 _n = 19_ 作為起點。
下面名為 _create_dataset()_ 的函數將使用平面一維向量中每條跡線的最后 _n_ 觀測值創建一個固定長度向量,然后將目標添加為最后一個元素向量。
簡單的機器學習算法需要對跟蹤數據進行扁平化。
```py
# create a fixed 1d vector for each trace with output variable
def create_dataset(sequences, targets):
# create the transformed dataset
transformed = list()
n_vars = 4
n_steps = 19
# process each trace in turn
for i in range(len(sequences)):
seq = sequences[i]
vector = list()
# last n observations
for row in range(1, n_steps+1):
for col in range(n_vars):
vector.append(seq[-row, col])
# add output
vector.append(targets[i])
# store
transformed.append(vector)
# prepare array
transformed = array(transformed)
transformed = transformed.astype('float32')
return transformed
```
我們可以像以前一樣加載數據集,并將其分類到數據集 1,2 和 3 中,如“_ 模型評估 _”部分所述。
然后我們可以調用 _create_dataset()_ 函數來創建 ES1 和 ES2 案例所需的數據集,特別是 ES1 組合數據集 1 和 2,而 ES2 使用數據集 1 和 2 作為訓練集,數據集 3 作為測試集。
下面列出了完整的示例。
```py
# prepare fixed length vector dataset
from os import listdir
from numpy import array
from numpy import savetxt
from pandas import read_csv
# return list of traces, and arrays for targets, groups and paths
def load_dataset(prefix=''):
grps_dir, data_dir = prefix+'groups/', prefix+'dataset/'
# load mapping files
targets = read_csv(data_dir + 'MovementAAL_target.csv', header=0)
groups = read_csv(grps_dir + 'MovementAAL_DatasetGroup.csv', header=0)
paths = read_csv(grps_dir + 'MovementAAL_Paths.csv', header=0)
# load traces
sequences = list()
target_mapping = None
for name in listdir(data_dir):
filename = data_dir + name
if filename.endswith('_target.csv'):
continue
df = read_csv(filename, header=0)
values = df.values
sequences.append(values)
return sequences, targets.values[:,1], groups.values[:,1], paths.values[:,1]
# create a fixed 1d vector for each trace with output variable
def create_dataset(sequences, targets):
# create the transformed dataset
transformed = list()
n_vars = 4
n_steps = 19
# process each trace in turn
for i in range(len(sequences)):
seq = sequences[i]
vector = list()
# last n observations
for row in range(1, n_steps+1):
for col in range(n_vars):
vector.append(seq[-row, col])
# add output
vector.append(targets[i])
# store
transformed.append(vector)
# prepare array
transformed = array(transformed)
transformed = transformed.astype('float32')
return transformed
# load dataset
sequences, targets, groups, paths = load_dataset()
# separate traces
seq1 = [sequences[i] for i in range(len(groups)) if groups[i]==1]
seq2 = [sequences[i] for i in range(len(groups)) if groups[i]==2]
seq3 = [sequences[i] for i in range(len(groups)) if groups[i]==3]
# separate target
targets1 = [targets[i] for i in range(len(groups)) if groups[i]==1]
targets2 = [targets[i] for i in range(len(groups)) if groups[i]==2]
targets3 = [targets[i] for i in range(len(groups)) if groups[i]==3]
# create ES1 dataset
es1 = create_dataset(seq1+seq2, targets1+targets2)
print('ES1: %s' % str(es1.shape))
savetxt('es1.csv', es1, delimiter=',')
# create ES2 dataset
es2_train = create_dataset(seq1+seq2, targets1+targets2)
es2_test = create_dataset(seq3, targets3)
print('ES2 Train: %s' % str(es2_train.shape))
print('ES2 Test: %s' % str(es2_test.shape))
savetxt('es2_train.csv', es2_train, delimiter=',')
savetxt('es2_test.csv', es2_test, delimiter=',')
```
運行該示例創建三個新的 CSV 文件,特別是' _es1.csv_ ',' _es2_train.csv_ '和' _es2_test.csv_ '用于 ES1 和分別為 ES2 病例。
還總結了這些數據集的形狀。
```py
ES1: (210, 77)
ES2 Train: (210, 77)
ES2 Test: (104, 77)
```
接下來,我們可以評估 ES1 數據集上的模型。
經過一些測試后,似乎標準化數據集會為那些依賴距離值(KNN 和 SVM)的方法帶來更好的模型技能,并且通常對其他方法沒有影響。因此,使用管道來評估首先標準化數據集的每個算法。
下面列出了新數據集上的抽樣檢查算法的完整示例。
```py
# spot check for ES1
from numpy import mean
from numpy import std
from pandas import read_csv
from matplotlib import pyplot
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
# load dataset
dataset = read_csv('es1.csv', header=None)
# split into inputs and outputs
values = dataset.values
X, y = values[:, :-1], values[:, -1]
# create a list of models to evaluate
models, names = list(), list()
# logistic
models.append(LogisticRegression())
names.append('LR')
# knn
models.append(KNeighborsClassifier())
names.append('KNN')
# cart
models.append(DecisionTreeClassifier())
names.append('CART')
# svm
models.append(SVC())
names.append('SVM')
# random forest
models.append(RandomForestClassifier())
names.append('RF')
# gbm
models.append(GradientBoostingClassifier())
names.append('GBM')
# evaluate models
all_scores = list()
for i in range(len(models)):
# create a pipeline for the model
s = StandardScaler()
p = Pipeline(steps=[('s',s), ('m',models[i])])
scores = cross_val_score(p, X, y, scoring='accuracy', cv=5, n_jobs=-1)
all_scores.append(scores)
# summarize
m, s = mean(scores)*100, std(scores)*100
print('%s %.3f%% +/-%.3f' % (names[i], m, s))
# plot
pyplot.boxplot(all_scores, labels=names)
pyplot.show()
```
運行該示例打印每個算法的估計表現,包括超過 5 倍交叉驗證的平均值和標準差。
結果表明 SVM 可能值得以 58%的準確度更詳細地查看。
```py
LR 55.285% +/-5.518
KNN 50.897% +/-5.310
CART 50.501% +/-10.922
SVM 58.551% +/-7.707
RF 50.442% +/-6.355
GBM 55.749% +/-5.423
```
結果也顯示為顯示分數分布的盒須圖。
同樣,SVM 似乎具有良好的平均表現和緊密的方差。

使用最近 19 次觀察在 ES1 上進行抽樣檢查算法
### 最后 _n_ 使用填充進行觀察
我們可以將每條跡線填充到固定長度。
這將提供在每個序列中包括更多先前 _n_ 觀察結果的靈活性。 _n_ 的選擇也必須與添加到較短序列的填充值的增加相平衡,這反過來可能對模型在這些序列上的表現產生負面影響。
我們可以通過將 0.0 值添加到每個變量序列的開頭來填充每個序列,直到最大長度,例如,達到了 200 個時間步長。我們可以使用 [pad()NumPy 函數](https://docs.scipy.org/doc/numpy/reference/generated/numpy.pad.html)來完成此操作。
```py
from numpy import pad
...
# pad sequences
max_length = 200
seq = pad(seq, ((max_length-len(seq),0),(0,0)), 'constant', constant_values=(0.0))
```
具有填充支持的 _create_dataset()_ 功能的更新版本如下。
我們將嘗試 _n = 25_ 以包括每個載體中每個序列中的 25 個最后觀察結果。雖然您可能想要探索其他配置是否會帶來更好的技能,但可以通過一些試驗和錯誤找到此值。
```py
# create a fixed 1d vector for each trace with output variable
def create_dataset(sequences, targets):
# create the transformed dataset
transformed = list()
n_vars, n_steps, max_length = 4, 25, 200
# process each trace in turn
for i in range(len(sequences)):
seq = sequences[i]
# pad sequences
seq = pad(seq, ((max_length-len(seq),0),(0,0)), 'constant', constant_values=(0.0))
vector = list()
# last n observations
for row in range(1, n_steps+1):
for col in range(n_vars):
vector.append(seq[-row, col])
# add output
vector.append(targets[i])
# store
transformed.append(vector)
# prepare array
transformed = array(transformed)
transformed = transformed.astype('float32')
return transformed
```
使用新功能再次運行腳本會創建更新的 CSV 文件。
```py
ES1: (210, 101)
ES2 Train: (210, 101)
ES2 Test: (104, 101)
```
同樣,重新運行數據上的抽樣檢查腳本會導致 SVM 模型技能的小幅提升,并且還表明 KNN 可能值得進一步調查。
```py
LR 54.344% +/-6.195
KNN 58.562% +/-4.456
CART 52.837% +/-7.650
SVM 59.515% +/-6.054
RF 50.396% +/-7.069
GBM 50.873% +/-5.416
```
KNN 和 SVM 的箱形圖顯示出良好的表現和相對緊密的標準偏差。

使用最近 25 次觀察對 ES1 上的抽樣檢查算法
我們可以更新點檢查到網格搜索 KNN 算法的一組 k 值,看看是否可以通過一點調整進一步改進模型的技能。
下面列出了完整的示例。
```py
# spot check for ES1
from numpy import mean
from numpy import std
from pandas import read_csv
from matplotlib import pyplot
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# load dataset
dataset = read_csv('es1.csv', header=None)
# split into inputs and outputs
values = dataset.values
X, y = values[:, :-1], values[:, -1]
# try a range of k values
all_scores, names = list(), list()
for k in range(1,22):
# evaluate
scaler = StandardScaler()
model = KNeighborsClassifier(n_neighbors=k)
pipeline = Pipeline(steps=[('s',scaler), ('m',model)])
names.append(str(k))
scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=5, n_jobs=-1)
all_scores.append(scores)
# summarize
m, s = mean(scores)*100, std(scores)*100
print('k=%d %.3f%% +/-%.3f' % (k, m, s))
# plot
pyplot.boxplot(all_scores, labels=names)
pyplot.show()
```
運行該示例打印精度的均值和標準差,k 值從 1 到 21。
我們可以看到 _k = 7_ 導致最佳技能為 62.872%。
```py
k=1 49.534% +/-4.407
k=2 49.489% +/-4.201
k=3 56.599% +/-6.923
k=4 55.660% +/-6.600
k=5 58.562% +/-4.456
k=6 59.991% +/-7.901
k=7 62.872% +/-8.261
k=8 59.538% +/-5.528
k=9 57.633% +/-4.723
k=10 59.074% +/-7.164
k=11 58.097% +/-7.583
k=12 58.097% +/-5.294
k=13 57.179% +/-5.101
k=14 57.644% +/-3.175
k=15 59.572% +/-5.481
k=16 59.038% +/-1.881
k=17 59.027% +/-2.981
k=18 60.490% +/-3.368
k=19 60.014% +/-2.497
k=20 58.562% +/-2.018
k=21 58.131% +/-3.084
```
_k_ 值的準確度得分的框和胡須圖顯示, _k_ 值約為 7,例如 5 和 6,也在數據集上產生穩定且表現良好的模型。

通過最后 25 次觀察,對 ES1 上的 KNN 鄰居進行抽查
### 在 ES2 上評估 KNN
現在我們已經了解了一個表示( _n = 25_ )和一個模型(KNN, _k = 7_ ),它們具有一定的隨機預測技能,我們可以測試該方法在更難的 ES2 數據集上。
每個模型都在數據集 1 和 2 的組合上進行訓練,然后在數據集 3 上進行評估。不使用 k 折交叉驗證程序,因此我們希望得分是有噪聲的。
下面列出了 ES2 算法的完整抽樣檢查。
```py
# spot check for ES2
from pandas import read_csv
from matplotlib import pyplot
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# load dataset
train = read_csv('es2_train.csv', header=None)
test = read_csv('es2_test.csv', header=None)
# split into inputs and outputs
trainX, trainy = train.values[:, :-1], train.values[:, -1]
testX, testy = test.values[:, :-1], test.values[:, -1]
# create a list of models to evaluate
models, names = list(), list()
# logistic
models.append(LogisticRegression())
names.append('LR')
# knn
models.append(KNeighborsClassifier())
names.append('KNN')
# knn
models.append(KNeighborsClassifier(n_neighbors=7))
names.append('KNN-7')
# cart
models.append(DecisionTreeClassifier())
names.append('CART')
# svm
models.append(SVC())
names.append('SVM')
# random forest
models.append(RandomForestClassifier())
names.append('RF')
# gbm
models.append(GradientBoostingClassifier())
names.append('GBM')
# evaluate models
all_scores = list()
for i in range(len(models)):
# create a pipeline for the model
scaler = StandardScaler()
model = Pipeline(steps=[('s',scaler), ('m',models[i])])
# fit
# model = models[i]
model.fit(trainX, trainy)
# predict
yhat = model.predict(testX)
# evaluate
score = accuracy_score(testy, yhat) * 100
all_scores.append(score)
# summarize
print('%s %.3f%%' % (names[i], score))
# plot
pyplot.bar(names, all_scores)
pyplot.show()
```
運行該示例報告 ES2 方案的模型準確性。
我們可以看到 KNN 表現良好,并且發現在 ES1 上表現良好的七個鄰居的 KNN 在 ES2 上也表現良好。
```py
LR 45.192%
KNN 54.808%
KNN-7 57.692%
CART 53.846%
SVM 51.923%
RF 53.846%
GBM 52.885%
```
精度分數的條形圖有助于使方法之間的表現相對差異更加清晰。

ES2 上模型精度的條形圖
所選擇的表示和模型配置確實具有超過預測的技能,準確度為 50%。
進一步調整可能會使模型具有更好的技能,我們距離 ES1 和 ES2 分別報告的 95%和 89%準確度還有很長的路要走。
### 擴展
本節列出了一些擴展您可能希望探索的教程的想法。
* **數據準備**。有很多機會可以探索更多的數據準備方法,例如歸一化,差分和功率變換。
* **特色工程**。進一步的特征工程可以產生更好的表現模型,例如每個序列的開始,中間和結束的統計以及趨勢信息。
* **調整**。只有 KNN 算法才有機會進行調整;梯度增強等其他模型可以從超參數的微調中受益。
* **RNNs** 。該序列分類任務似乎非常適合于循環神經網絡,例如支持可變長度多變量輸入的 LSTM。對該數據集進行的一些初步測試(由我自己)顯示出非常不穩定的結果,但更廣泛的調查可能會給出更好甚至更好的結果。
如果你探索任何這些擴展,我很想知道。
## 進一步閱讀
如果您希望深入了解,本節將提供有關該主題的更多資源。
### 文件
* [通過油藏計算預測用戶在異質室內環境中的移動](https://pdfs.semanticscholar.org/40c2/393e1874c3fd961fdfff02402c24ccf1c3d7.pdf#page=13),2011。
* [環境輔助生活應用中儲層計算的實驗表征](https://link.springer.com/article/10.1007/s00521-013-1364-4),2014。
### API
* [sklearn.model_selection.cross_val_score API](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html)
* [numpy.linalg.lstsq API](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html)
* [numpy.pad API](https://docs.scipy.org/doc/numpy/reference/generated/numpy.pad.html)
### 用品
* [來自 RSS 數據集的室內用戶移動預測,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Indoor+User+Movement+Prediction+from+RSS+data)
* [通過油藏計算預測非均質室內環境中的用戶移動,Paolo Barsocchi 主頁](http://wnlab.isti.cnr.it/paolo/index.php/dataset/6rooms)。
* [來自 RSS 數據集](https://github.com/Laurae2/Indoor_Prediction)的室內用戶移動預測,Laurae [法語]。
## 摘要
在本教程中,您發現了室內運動預測時間序列分類問題以及如何設計功能并評估問題的機器學習算法。
具體來說,你學到了:
* 基于傳感器強度預測房間運動的時間序列分類問題。
* 如何調查數據以便更好地理解問題以及如何從原始數據中設計特征以進行預測建模。
* 如何檢查一套分類算法并調整一種算法以進一步提高問題的表現。
你有任何問題嗎?
在下面的評論中提出您的問題,我會盡力回答。
- 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& 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 步迷你課程