<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/how-to-predict-room-occupancy-based-on-environmental-factors/](https://machinelearningmastery.com/how-to-predict-room-occupancy-based-on-environmental-factors/) 諸如 Arduino 設備之類的小型計算機可以在建筑物內用于記錄環境變量,從中可以預測簡單和有用的屬性。 一個示例是基于諸如溫度,濕度和相關措施的環境措施來預測房間是否被占用。 這是一種稱為房間占用分類的常見時間序列分類問題。 在本教程中,您將發現一個標準的多變量時間序列分類問題,用于使用環境變量的測量來預測房間占用率。 完成本教程后,您將了解: * 機器學習中的占用檢測標準時間序列分類問題。 * 如何加載和可視化多變量時間序列分類數據。 * 如何開發簡單的幼稚和邏輯回歸模型,以達到近乎完美的技能。 讓我們開始吧。 * **更新 Oct / 2018** :更新了數據集來源的描述(我真的搞砸了),謝謝 Luis Candanedo。 ## 教程概述 本教程分為四個部分;他們是: 1. 占用檢測問題描述 2. 數據可視化 3. 連接數據集 4. 簡單的預測模型 ## 占用檢測問題描述 標準時間序列分類數據集是 UCI 機器學習庫中可用的“_ 占用檢測 _”問題。 * [占用檢測數據集,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+) 這是一個二元分類問題,需要使用諸如溫度和濕度的環境因素的觀察來分類房間是否被占用或未被占用。 該數據集在 2016 年論文“[使用統計學習模型](https://www.sciencedirect.com/science/article/pii/S0378778815304357)”的 Luis M. Candanedo 和 VéroniqueFeldheim 的光,溫度,濕度和 CO2 測量的辦公室精確占用檢測中進行了描述。 通過使用一套環境傳感器監控辦公室并使用攝像機確定房間是否被占用來收集數據集。 > 監測辦公室房間的以下變量:溫度,濕度,光照和二氧化碳水平。采用微控制器來獲取數據。 ZigBee 無線電連接到它并用于將信息傳輸到記錄站。數碼相機用于確定房間是否被占用。相機時間每分鐘標記圖片,并且手動研究這些圖片以標記數據。 - [使用統計學習模型](https://www.sciencedirect.com/science/article/pii/S0378778815304357),2016 年,通過光照,溫度,濕度和 CO2 測量精確占用辦公室。 數據提供日期時間信息和多天每分鐘采取的六項環境措施,具體為: * 溫度以攝氏度為單位。 * 相對濕度百分比。 * 以勒克斯測量的光。 * 二氧化碳以百萬分之一計。 * 濕度比,源自溫度和相對濕度,以千克水蒸氣/千克空氣測量。 * 占用率為 1 表示占用,0 表示未占用。 該數據集已用于許多簡單的建模機器學習論文中。例如,參見文章“[基于可見光的占用推斷使用集合學習](https://ieeexplore.ieee.org/document/8302496/),”2018 以獲得進一步的參考。 ## 數據可視化 這些數據以 CSV 格式提供三個文件,聲稱是用于訓練,驗證和測試的數據分割。 這三個文件如下: * **datatest.txt** (測試):從 2015-02-02 14:19:00 到 2015-02-04 10:43:00 * **datatraining.txt** (訓練):從 2015-02-04 17:51:00 到 2015-02-10 09:33:00 * **datatest2.txt** (val):從 2015-02-11 14:48:00 到 2015-02-18 09:19:00 最初顯而易見的是,數據中的分割在時間上并不是連續的,并且存在差距。 測試數據集在訓練和驗證數據集之前及時。也許這是文件命名約定中的錯誤。我們還可以看到數據從 2 月 2 日延伸到 2 月 18 日,該日期跨越 17 個日歷日,而不是 20 個日歷日。 從這里下載文件并將它們放在當前的工作目錄中: * [占用檢測數據集,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+) 每個文件都包含一個標題行,但包含一個行號的列,該列不包括標題行中的條目。 為了正確加載數據文件,請更新每個文件的標題行,如下所示: 從: ```py "date","Temperature","Humidity","Light","CO2","HumidityRatio","Occupancy" ``` 至: ```py "no","date","Temperature","Humidity","Light","CO2","HumidityRatio","Occupancy" ``` 下面是帶有修改的 _datatraining.txt_ 文件的前五行示例。 ```py "no","date","Temperature","Humidity","Light","CO2","HumidityRatio","Occupancy" "1","2015-02-04 17:51:00",23.18,27.272,426,721.25,0.00479298817650529,1 "2","2015-02-04 17:51:59",23.15,27.2675,429.5,714,0.00478344094931065,1 "3","2015-02-04 17:53:00",23.15,27.245,426,713.5,0.00477946352442199,1 "4","2015-02-04 17:54:00",23.15,27.2,426,708.25,0.00477150882608175,1 "5","2015-02-04 17:55:00",23.1,27.2,426,704.5,0.00475699293331518,1 ... ``` 然后我們可以使用 Pandas _read_csv()_ 函數加載數據文件,如下所示: ```py # load all data data1 = read_csv('datatest.txt', header=0, index_col=1, parse_dates=True, squeeze=True) data2 = read_csv('datatraining.txt', header=0, index_col=1, parse_dates=True, squeeze=True) data3 = read_csv('datatest2.txt', header=0, index_col=1, parse_dates=True, squeeze=True) ``` 加載后,我們可以為六個系列中的每一個創建一個圖,清楚地顯示三個數據集的及時分離。 下面列出了完整的示例。 ```py from pandas import read_csv from matplotlib import pyplot # load all data data1 = read_csv('datatest.txt', header=0, index_col=1, parse_dates=True, squeeze=True) data2 = read_csv('datatraining.txt', header=0, index_col=1, parse_dates=True, squeeze=True) data3 = read_csv('datatest2.txt', header=0, index_col=1, parse_dates=True, squeeze=True) # determine the number of features n_features = data1.values.shape[1] pyplot.figure() for i in range(1, n_features): # specify the subpout pyplot.subplot(n_features, 1, i) # plot data from each set pyplot.plot(data1.index, data1.values[:, i]) pyplot.plot(data2.index, data2.values[:, i]) pyplot.plot(data3.index, data3.values[:, i]) # add a readable name to the plot pyplot.title(data1.columns[i], y=0.5, loc='right') pyplot.show() ``` 運行該示例會為每個數據集創建一個具有不同顏色的繪圖: * _datatest.txt_ (測試):藍色 * _datatraining.txt_ (訓練):橙色 * _datatest2.txt_ (val):綠色 我們可以看到測試和訓練集之間的小差距以及訓練和驗證集之間的較大差距。 我們還可以看到每個變量的系列中相應的結構(峰值)和房間占用率。 ![Line Plot Showing Time Series Plots for all variables and each dataset](https://img.kancloud.cn/7e/8b/7e8bab135a884b1b6d26bbdc75c9433c_1280x960.jpg) 線圖顯示所有變量和每個數據集的時間序列圖 ## 連接數據集 我們可以通過保留數據的時間一致性并將所有三個集合連接成一個數據集來簡化數據集,刪除“ _no_ ”列。 這將允許臨時測試問題的簡單直接框架(在下一部分中),該臨時框架可以在臨時一致的方式上使用特殊訓練/測試裝置尺寸進行測試。 **注意**:這種簡化不考慮數據中的時間間隙,并且依賴于先前時??間步驟的一系列觀察的算法可能需要不同的數據組織。 下面的示例加載數據,將其連接到時間上一致的數據集,并將結果保存到名為“ _combined.csv_ ”的新文件中。 ```py from pandas import read_csv from pandas import concat # load all data data1 = read_csv('datatest.txt', header=0, index_col=1, parse_dates=True, squeeze=True) data2 = read_csv('datatraining.txt', header=0, index_col=1, parse_dates=True, squeeze=True) data3 = read_csv('datatest2.txt', header=0, index_col=1, parse_dates=True, squeeze=True) # vertically stack and maintain temporal order data = concat([data1, data2, data3]) # drop row number data.drop('no', axis=1, inplace=True) # save aggregated dataset data.to_csv('combined.csv') ``` 運行該示例將連接的數據集保存到新文件' _combined.csv_ '。 ## 簡單的預測模型 該問題最簡單的表述是根據當前的環境條件預測占用率。 我將此稱為直接模型,因為它沒有利用先前時間步驟的環境措施的觀察結果。從技術上講,這不是序列分類,它只是一個直接的分類問題,其中觀察是在時間上排序的。 這似乎是我從文獻中略讀的問題的標準表達,令人失望的是,論文似乎使用了 UCI 網站上標注的訓練/驗證/測試數據。 我們將使用上一節中描述的組合數據集,并通過將最后 30%的數據作為測試集保留來評估模型技能。例如: ```py # load the dataset data = read_csv('combined.csv', header=0, index_col=0, parse_dates=True, squeeze=True) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.3, shuffle=False, random_state=1) ``` 接下來,我們可以從一個樸素的預測模型開始評估數據集的一些模型。 ### 樸素的模型 這個問題的一個簡單模型是預測最突出的階級結果。 這稱為零規則,或原始預測算法。我們將評估測試集中每個示例的所有 0(未占用)和全 1(占用)的預測,并使用精度度量來評估方法。 下面是一個函數,它將根據測試集和選擇的結果變量執行這種樸素的預測 ```py def naive_prediction(testX, value): return [value for x in range(len(testX))] ``` 下面列出了完整的示例。 ```py # naive prediction model from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # load the dataset data = read_csv('../datasets/occupancy_data/combined.csv', header=0, index_col=0, parse_dates=True, squeeze=True) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.3, shuffle=False, random_state=1) # make a naive prediction def naive_prediction(testX, value): return [value for x in range(len(testX))] # evaluate skill of predicting each class value for value in [0, 1]: # forecast yhat = naive_prediction(testX, value) # evaluate score = accuracy_score(testy, yhat) # summarize print('Naive=%d score=%.3f' % (value, score)) ``` 運行該示例打印樸素預測和相關分數。 通過預測全部 0,我們可以看到基線分數約為 82%的準確度。都沒有入住。 對于任何被認為對該問題熟練的模型,它必須達到 82%或更高的技能。 ```py Naive=0 score=0.822 Naive=1 score=0.178 ``` ### Logistic 回歸 文獻的摘要顯示了應用于該問題的一系列復雜的神經網絡模型。 首先,讓我們嘗試一個簡單的邏輯回歸分類算法。 下面列出了完整的示例。 ```py # logistic regression from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression # load the dataset data = read_csv('combined.csv', header=0, index_col=0, parse_dates=True, squeeze=True) values = data.values # split data into inputs and outputs X, y = values[:, :-1], values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.3, shuffle=False, random_state=1) # define the model model = LogisticRegression() # fit the model on the training set model.fit(trainX, trainy) # predict the test set yhat = model.predict(testX) # evaluate model skill score = accuracy_score(testy, yhat) print(score) ``` 運行該示例在訓練數據集上擬合邏輯回歸模型并預測測試數據集。 該模型的技能大約 99%準確,顯示出樸素方法的技巧。 通常,我建議在建模之前對數據進行居中和規范化,但是一些試驗和錯誤表明,未縮放數據的模型更加熟練。 ```py 0.992704280155642 ``` 乍一看這是一個令人印象深刻的結果。 盡管測試設置與研究文獻中的測試設置不同,但是報告的非常簡單模型的技能優于更復雜的神經網絡模型。 ### 特征選擇和 Logistic 回歸 仔細觀察時間序列圖可以看出房間被占用的時間與環境措施的峰值之間存在明顯的關系。 這是有道理的,并解釋了為什么這個問題實際上很容易建模。 我們可以通過單獨測試每個環境度量的簡單邏輯回歸模型來進一步簡化模型。我們的想法是,我們不需要所有數據來預測占用率;或許只是其中一項措施就足夠了。 這是最簡單的特征選擇類型,其中創建模型并單獨評估每個特征。更高級的方法可以考慮每個特征子組。 下面列出了使用五個輸入功能中的每一個單獨測試邏輯模型的完整示例。 ```py # logistic regression feature selection from pandas import read_csv from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression # load the dataset data = read_csv('combined.csv', header=0, index_col=0, parse_dates=True, squeeze=True) values = data.values # basic feature selection features = [0, 1, 2, 3, 4] for f in features: # split data into inputs and outputs X, y = values[:, f].reshape((len(values), 1)), values[:, -1] # split the dataset trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.3, shuffle=False, random_state=1) # define the model model = LogisticRegression() # fit the model on the training set model.fit(trainX, trainy) # predict the test set yhat = model.predict(testX) # evaluate model skill score = accuracy_score(testy, yhat) print('feature=%d, name=%s, score=%.3f' % (f, data.columns[f], score)) ``` 運行該示例將打印特征索引,名稱以及在該特征上訓練的邏輯模型的技能,并在測試集上進行評估。 我們可以看到只需要“ _Light_ ”變量就可以在此數據集上實現 99%的準確率。 記錄環境變量的實驗室很可能有一個光傳感器,當房間被占用時,它會打開內部燈。 或者,也許在白天記錄光(例如通過窗戶的陽光),并且房間在每天或每周工作日被占用。 至少,本教程的結果會詢問有關使用此數據集的任何研究論文的一些難題,因為顯然它不是一個具有挑戰性的預測問題。 ```py feature=0, name=Temperature, score=0.799 feature=1, name=Humidity, score=0.822 feature=2, name=Light, score=0.991 feature=3, name=CO2, score=0.763 feature=4, name=HumidityRatio, score=0.822 ``` ## 擴展 這些數據可能仍然有待進一步調查。 一些想法包括: * 如果移除光柱,問題可能會更具挑戰性。 * 也許問題可以被描述為真正的多變量時間序列分類,其中在模型中使用滯后觀察。 * 也許在預測中可以利用環境變量中的明顯峰值。 我簡單地嘗試了這些模型而沒有令人興奮的結果。 如果您瀏覽任何這些擴展或在線查找一些示例,請在下面的評論中告訴我們。 ## 進一步閱讀 如果您希望深入了解,本節將提供有關該主題的更多資源。 * [占用檢測數據集,UCI 機器學習庫](https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+) * [GitHub 上的占用檢測數據](https://github.com/LuisM78/Occupancy-detection-data) * [支持需求驅動的 HVAC 運行的基于多傳感器的占用估計模型](https://dl.acm.org/citation.cfm?id=2339455),2012。 * [使用統計學習模型](https://www.sciencedirect.com/science/article/pii/S0378778815304357),2016 年對光線,溫度,濕度和 CO2 測量的辦公室進行精確的占用檢測。 * [基于可見光的占用推斷使用集成學習](https://ieeexplore.ieee.org/document/8302496/),2018。 ## 摘要 在本教程中,您發現了一個標準的多變量時間序列分類問題,用于使用環境變量的度量來預測房間占用率。 具體來說,你學到了: * 機器學習中的占用檢測標準時間序列分類問題。 * 如何加載和可視化多變量時間序列分類數據。 * 如何開發簡單的幼稚和邏輯回歸模型,以達到近乎完美的技能。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看