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.
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:
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:
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
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.
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()
五、结论
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!