<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 基于機器學習算法的室內運動時間序列分類 > 原文: [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** :添加了指向數據集鏡像的鏈接。 ![Indoor Movement Time Series Classification with Machine Learning Algorithms](https://img.kancloud.cn/86/8d/868d9dd6dd2663fdab07323fe2a63116_640x428.jpg) 室內運動時間序列分類與機器學習算法 照片由 [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)。 ![Overview of two rooms, sensor locations and the 6 pre-defined paths](https://img.kancloud.cn/69/0f/690f416f5fdcb389a8edf9ff9b13b9c9_792x458.jpg) 兩個房間概述,傳感器位置和 6 個預定義路徑。 取自“通過油藏計算預測異構室內環境中的用戶移動”。 從三對兩個房間收集三個數據集,其中走路徑并進行傳感器測量,稱為數據集 1,數據集 2 和數據集 3。 下表摘自論文,總結了三個數據集中每個數據集中走的路徑數,房間更改總數和非房間更改(類標簽)以及時間序列輸入的長度。 ![Summary of sensor data collected from the three pairs of two rooms](https://img.kancloud.cn/ed/b3/edb314bd985f1cfa57d56bf824c0a86f_838x466.jpg) 從三對兩個房間收集的傳感器數據摘要。 取自“通過油藏計算預測異構室內環境中的用戶移動”。 從技術上講,數據由多變量時間序列輸入和分類輸出組成,可以描述為時間序列分類問題。 > 來自四個錨的 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 的觀測數據太多。這可能表示可以標記甚至從序列中過濾掉的通用“無強度”觀察結果。 調查分布是否按路徑類型甚至數據集編號更改可能會很有趣。 ![Histograms for the sensor strength values for each anchor point](https://img.kancloud.cn/33/5b/335b96519543657e45aebee746aa443e_1280x960.jpg) 每個錨點的傳感器強度值的直方圖 最后,創建序列長度的直方圖。 我們可以看到長度在 25,40 和 60 之間的序列簇。我們還可以看到,如果我們想要修剪長序列,那么最長約 70 個時間步長可能是合適的。最小長度似乎是 19。 ![Histogram of sensor strength sequence lengths](https://img.kancloud.cn/22/2e/222ea445bb8639b59c611f60117d971b_1280x960.jpg) 傳感器強度序列長度的直方圖 ### 時間序列圖 我們正在處理時間序列數據,因此我們實際查看序列的一些示例非常重要。 我們可以按路徑對軌跡進行分組,并為每條路徑繪制一條軌跡的示例。期望不同路徑的跡線在某些方面可能看起來不同。 ```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() ``` 運行該示例將創建一個包含六個圖形的圖表,每個圖形對應六個路徑中的每一個。給定的圖顯示了單個跡線的線圖,其中包含跡線的四個變量,每個錨點一個。 也許所選擇的跡線代表每條路徑,也許不是。 我們可以看到一些明顯的差異: * **隨時間變化的變量分組**。成對變量可以組合在一起,或者所有變量可以在給定時間組合在一起。 * **隨時間變化的趨勢**。變量聚集在一起向中間或分散到極端。 理想情況下,如果行為的這些變化是預測性的,則預測模型必須提取這些特征,或者將這些特征的摘要作為輸入呈現。 ![Line plots of one trace (4 variables) for each of the six paths](https://img.kancloud.cn/09/c9/09c9daa8dd21dd20aa68bdf40823c8fa_1280x960.jpg) 六條路徑中每條路徑的一條跡線(4 個變量)的線圖。 創建第二個圖,顯示單個跡線中四個系列的線圖以及趨勢線。 我們可以看到,至少對于這種跡線,當用戶在環境中移動時,傳感器強度數據有明顯的趨勢。這可能表明有機會在建模之前使數據靜止或使用跡線中的每個系列的趨勢(觀察或系數)作為預測模型的輸入。 ![Line plots for the time series in a single trace with trend lines](https://img.kancloud.cn/63/29/6329d9e4bdc8b3de33e661cf2d667d20_1280x960.jpg) 具有趨勢線的單個跡線中的時間序列的線圖 ## 模型評估 有許多方法可以擬合和評估此數據的模型。 鑒于類的平衡,分類準確性似乎是一個良好的首先評估指標。通過預測概率和探索 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 似乎具有良好的平均表現和緊密的方差。 ![Spot-check Algorithms on ES1 with last 19 observations](https://img.kancloud.cn/0c/9c/0c9c7aadc9061ca4aea3291ec85e14a2_1280x960.jpg) 使用最近 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 的箱形圖顯示出良好的表現和相對緊密的標準偏差。 ![Spot-check Algorithms on ES1 with last 25 observations](https://img.kancloud.cn/98/a3/98a3bf8bbb59c3d26053ef1012de50a6_1280x960.jpg) 使用最近 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,也在數據集上產生穩定且表現良好的模型。 ![Spot-check KNN neighbors on ES1 with last 25 observations](https://img.kancloud.cn/53/fe/53fe95265a7414f5754f15dfa5fbe52b_1280x960.jpg) 通過最后 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% ``` 精度分數的條形圖有助于使方法之間的表現相對差異更加清晰。 ![Bar chart of model accuracy on ES2](https://img.kancloud.cn/0c/1b/0c1bf835ffdd9bc424e150dd7d8a1f59_1280x960.jpg) 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 [法語]。 ## 摘要 在本教程中,您發現了室內運動預測時間序列分類問題以及如何設計功能并評估問題的機器學習算法。 具體來說,你學到了: * 基于傳感器強度預測房間運動的時間序列分類問題。 * 如何調查數據以便更好地理解問題以及如何從原始數據中設計特征以進行預測建模。 * 如何檢查一套分類算法并調整一種算法以進一步提高問題的表現。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看