Rumah > Peranti teknologi > AI > Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

王林
Lepaskan: 2023-04-04 12:40:07
ke hadapan
1703 orang telah melayarinya

XGBoost ialah perpustakaan pembelajaran mesin sumber terbuka yang popular yang boleh digunakan untuk menyelesaikan pelbagai masalah ramalan. Seseorang perlu memahami cara menggunakannya dengan InfluxDB untuk ramalan siri masa.

Penterjemah |. Li Rui

Penyemak |. Sun Shujuan

XGBoost ialah perpustakaan pembelajaran mesin sumber terbuka yang melaksanakan algoritma penggalak kecerunan teragih yang dioptimumkan. XGBoost menggunakan pemprosesan selari untuk prestasi pantas, mengendalikan nilai yang hilang dengan baik, berprestasi baik pada set data kecil dan mengelakkan pemasangan berlebihan. Semua kelebihan ini menjadikan XGBoost penyelesaian yang popular untuk masalah regresi seperti ramalan.

Ramalan adalah misi kritikal untuk pelbagai matlamat perniagaan seperti analisis ramalan, penyelenggaraan ramalan, perancangan produk, belanjawan, dsb. Banyak masalah ramalan atau ramalan melibatkan data siri masa. Ini menjadikan XGBoost rakan kongsi yang sangat baik untuk pangkalan data siri masa sumber terbuka InfluxDB.

Tutorial ini akan mempelajari cara menggunakan pakej Python XGBoost untuk meramal data daripada pangkalan data siri masa InfluxDB. Anda juga akan menggunakan pustaka klien InfluxDB Python untuk menanyakan data daripada InfluxDB dan menukar data kepada Pandas DataFrame untuk memudahkan anda bekerja dengan data siri masa sebelum membuat ramalan. Selain itu, kelebihan XGBoost akan dibincangkan dengan lebih terperinci.

1. Keperluan

Tutorial ini dilakukan pada sistem macOS dengan Python 3 dipasang melalui Homebrew. Adalah disyorkan untuk menyediakan alat tambahan seperti virtualenv, pyenv atau conda-env untuk memudahkan pemasangan Python dan klien. Jika tidak, keperluan penuhnya adalah seperti berikut:

  • influxdb-client=1.30.0
  • pandas = 1.4.3
  • xgboost>=1.7.3
  • influxdb-client>=1.30.0
  • pandas>=1.4.3
  • matplotlib>=3.5.2
  • sklearn>=1.1 >
Tutorial ini juga menganggap bahawa anda mempunyai akaun awan InfluxDB peringkat percuma dan anda telah mencipta baldi dan token Fikirkan baldi sebagai pangkalan data atau struktur peringkat tertinggi untuk organisasi data dalam InfluxDB. Dalam tutorial ini, baldi bernama NOAA akan dibuat.

2. Pokok keputusan, hutan rawak dan peningkatan kecerunan

Untuk memahami apa itu XGBoost, anda mesti memahami pepohon keputusan, hutan rawak dan peningkatan kecerunan. Pohon keputusan ialah kaedah pembelajaran diselia yang terdiri daripada satu siri ujian ciri. Setiap nod ialah ujian, dan semua nod disusun dalam struktur carta alir. Cawangan mewakili keadaan yang akhirnya menentukan label daun atau label kelas yang diberikan kepada data input.

Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

Pokok keputusan dalam pembelajaran mesin digunakan untuk menentukan sama ada hujan akan turun esok. Diedit untuk menunjukkan komponen pokok keputusan: daun, dahan dan nod.

Prinsip panduan di sebalik pokok keputusan, hutan rawak dan peningkatan kecerunan ialah berbilang "pembelajar yang lemah" atau pengelas bekerjasama untuk membuat ramalan yang kukuh.

Hutan rawak mengandungi berbilang pokok keputusan. Setiap nod dalam pepohon keputusan dianggap sebagai pelajar lemah, dan setiap pepohon keputusan dalam hutan rawak dianggap sebagai salah satu daripada banyak pelajar lemah dalam model hutan rawak. Biasanya, semua data dibahagikan secara rawak kepada subset dan melalui pepohon keputusan yang berbeza.

Peningkatan kecerunan menggunakan pepohon keputusan dan hutan rawak adalah serupa, tetapi cara ia distrukturkan berbeza. Pokok yang dirangsang kecerunan juga mengandungi hutan pokok keputusan, tetapi pokok keputusan ini juga dibina dan semua data dihantar melalui himpunan pokok keputusan. Pokok penggalak kecerunan mungkin terdiri daripada satu set pokok klasifikasi atau pokok regresi, dengan pokok klasifikasi untuk nilai diskret (seperti kucing atau anjing). Pokok regresi digunakan untuk nilai berterusan (cth. 0 hingga 100).

3. Apakah itu XGBoost?

Peningkatan kecerunan ialah algoritma pembelajaran mesin untuk pengelasan dan ramalan. XGBoost hanyalah sejenis peningkatan kecerunan yang melampau. Pada tahap yang melampau, peningkatan kecerunan boleh dilakukan dengan lebih cekap melalui kuasa pemprosesan selari. Imej di bawah daripada dokumentasi XGBoost menggambarkan cara peningkatan kecerunan boleh digunakan untuk meramalkan sama ada seseorang akan menyukai permainan video.

Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

Dua pokok keputusan digunakan untuk memutuskan sama ada seseorang berkemungkinan menyukai permainan video. Tambahkan skor daun daripada kedua-dua pokok untuk menentukan orang yang paling berkemungkinan akan menikmati permainan video.

Beberapa kelebihan XGBoost:

    Agak mudah difahami.
  • Sesuai untuk data kecil, berstruktur dan biasa dengan sedikit ciri.
Beberapa kelemahan XGBoost:

  • Mudah untuk dipasang terlalu banyak dan sensitif kepada outlier. Mungkin idea yang baik untuk menggunakan paparan nyata data siri masa dalam XGBoost untuk peramalan.
  • Berprestasi buruk pada data yang jarang atau tidak diawasi.

4. Gunakan XGBoost untuk ramalan siri masa

Apa yang digunakan di sini ialah set data sampel sensor udara, yang disediakan oleh InfluxDB. Set data ini mengandungi data suhu daripada berbilang penderia. Ramalan suhu sedang dibuat untuk penderia tunggal dengan data seperti ini:

Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

Gunakan kod Fluks berikut untuk mengimport set data dan penapis untuk satu siri masa. (Flux ialah bahasa pertanyaan InfluxDB)

import "join"

import "influxdata/influxdb/sample"

//dataset ialah siri masa biasa pada selang 10 saat

data = sample.data(set: "airSensor")

|> penapis(fn: (r) => r._field == "suhu" dan r.sensor_id = = "TLM0100")

Penggalak hutan dan kecerunan rawak boleh digunakan untuk peramalan siri masa, tetapi mereka memerlukan menukar data kepada pembelajaran terselia. Ini bermakna bahawa data mesti digerakkan ke hadapan dalam pendekatan tetingkap gelongsor atau pendekatan bergerak perlahan untuk menukar data siri masa kepada set pembelajaran yang diselia. Data juga boleh disediakan dengan Flux. Sebaik-baiknya, beberapa analisis autokorelasi perlu dilakukan terlebih dahulu untuk menentukan kaedah terbaik untuk digunakan. Untuk kepentingan ringkas, kod Fluks berikut akan digunakan untuk memindahkan data pada selang masa yang tetap.

import "join"

import "influxdata/influxdb/sample"

data = sample.data(set: "airSensor")

|> ; penapis(fn: (r) => r._field == "suhu" dan r.sensor_id == "TLM0100")

shiftedData = data

|> : 10s, lajur: ["_time"] )

join.time(kiri: data, kanan: shiftedData, sebagai: (l, r) => ({l dengan data: l._value, shiftedData : r._value}))

|> drop(lajur: ["_measurement", "_time", "_value", "sensor_id", "_field"])

Leret ke kiri atau kanan untuk melihat kod penuh

Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

Jika anda ingin menambah data lag tambahan pada input model, anda boleh mengikut logik Fluks berikut.

import "eksperimen"

import "influxdata/influxdb/sample"

data = sample.data(set: "airSensor")

|> ; penapis(fn: (r) => r._field == "suhu" dan r.sensor_id == "TLM0100")



shiftedData1 = data

|> timeShift(tempoh: 10s, lajur: ["_masa"] )

|> set(kunci: "shift" , nilai: "1" )



shiftedData2 = data

|> timeShift(tempoh: 20s , lajur: ["_time"] )

|> )



shiftedData3 = data

|> timeShift(tempoh: 30s , lajur: ["_time"] )

|> kunci: "shift" , nilai: "3")



shiftedData4 = data

|> timeShift(tempoh: 40s , lajur: ["_masa"] )

|> set(kunci: "shift" , nilai: "4")



union(jadual: [shiftedData1, shiftedData2, shiftedData3, shiftedData4])

|> pivot(rowKey:["_time"], columnKey: ["shift"], valueColumn: "_value")

|> "_masa", "_value", "sensor_id", "_field"])

// alih keluar nilai NaN

|> had(n:360)

|> tail(n: 356)

Selain itu, kita mesti menggunakan pengesahan hadapan untuk melatih algoritma. Ini melibatkan pembahagian set data kepada set ujian dan set latihan. Kemudian gunakan XGB Regressor untuk melatih model XGBoost dan gunakan kaedah pemasangan untuk meramal. Akhir sekali, kami menggunakan min ralat mutlak (MAE) untuk menentukan ketepatan ramalan. Untuk kelewatan 10 saat, ralat mutlak min yang dikira (MAE) ialah 0.035. Kita boleh mentafsirkan ini bermakna bahawa 96.5% daripada ramalan adalah sangat betul. Rajah di bawah menunjukkan perbandingan antara ramalan yang kami peroleh daripada XGBoost dan nilai yang dijangkakan daripada pemisahan kereta api/ujian.

Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa

Berikut ialah skrip lengkapnya. Kod ini kebanyakannya diambil daripada tutorial di sini.

import panda sebagai pd

daripada numpy import asarray

daripada sklearn.metrics import mean_absolute_error

daripada xgboost import XGBRegressor

importf
🎜>
daripada influxdb_client import InfluxDBClient

daripada influxdb_client.client.write_api import SYNCHRONOUS



# data pertanyaan dengan Perpustakaan InfluxDB Client yang diubah masalah pembelajaran dengan Flux

klien = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWpBh0b0kMQWpBh0b DPsearTWA== ", org="0437f6d51b579000")



# write_api = client.write_api(write_optinotallow=SYNCHRONOUS)

query_api = client.query_api()
'import "influxdata/influxdb/sample"'

'data = sample.data(set: "airSensor")'

'|> penapis(fn: (r) => r._field == "suhu" dan r.sensor_id == "TLM0100")'

'shiftedData = data'

'|> timeShift(tempoh: 10s , lajur: ["_time"] )'

'join.time(kiri: data, kanan: shiftedData, sebagai: (l, r) = > ({l dengan data: l._value, shiftedData: r._value}))'

'|> drop(lajur: ["_ukuran", "_masa", "_nilai", "id_sensor", "_medan"])'

'|> hasil(nama: "ditukar kepada set data pembelajaran diselia")'

)

df = df.drop(columns=['table', 'result'])

data = df.to_numpy()



# bahagikan set data univariate kepada set kereta api/ujian

def train_test_split(data, n_test):

kembali data[:-n_test:], data[-n_test:]



# muat model xgboost dan buat ramalan satu langkah

def xgboost_forecast(kereta api, testX) :

# tukar senarai kepada tatasusunan

kereta api = asarray(kereta api)

# pecahkan kepada lajur input dan output

trainX, trainy = train[: , :-1], kereta api[:, -1]

# model muat

model = XGBRegressor(objective='reg:squarederror', n_estimators=1000)

model.fit(trainX, trainy)

# buat ramalan satu langkah

yhat = model.predict(asarray([testX]))

return yhat[0 ]



# pengesahan berjalan ke hadapan untuk data univariate

definisi walk_forward_validation(data, n_test):

ramalan = senarai()

# set data split

kereta api, ujian = train_test_split(data, n_test)

sejarah = [x untuk x dalam kereta api]

# langkah di atas setiap langkah masuk set ujian

untuk i dalam julat(len(ujian)):

# pisah baris ujian ke lajur input dan output

testX, testy = test[i, : -1], uji[i, -1]

# model muat pada sejarah dan buat ramalan

yhat = xgboost_forecast(sejarah, testX)

# ramalan kedai dalam senarai ramalan

ramalan.tambah(yhat)

# tambahkan pemerhatian sebenar pada sejarah untuk gelung seterusnya

sejarah.tambah(ujian[i])

# meringkaskan kemajuan

print('>expected=%.1f, predicted=%.1f' % (testy, yhat))

# anggaran ralat ramalan

ralat = min_absolute_error(ujian[:, -1], ramalan)

kembali ralat, ujian[:, -1], ramalan



# nilai

mae, y, yhat = walk_forward_validation(data, 100)

print('MAE: %.3f' % mae)



# plot dijangka vs ramalan

pyplot.plot(y, label='Expected')

pyplot.plot(yhat, label='Predicted')

pyplot.legend()

pyplot.show()

五、结论

希望这篇博文能够激励人们利用XGDB颌这篇博文能够激励人们利用XGDB钌语为们利用建议查看相关的报告,其中包括如何使用本文描述的许多算法和InfluxDB来进行预测和执行异常检测的示例。预来进行预测和执行异常检测的示例。

Atas ialah kandungan terperinci Cara menggunakan XGBoost dan InluxDB untuk ramalan siri masa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan