۳۰ آذر ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

پیش بینی سری های زمانی با XGBoost و InfluxDB

XGBoost یک کتابخانه یادگیری ماشین منبع باز محبوب است که می تواند برای حل انواع مشکلات پیش بینی استفاده شود. در اینجا نحوه استفاده از XGBoost با InfluxDB آورده شده است.

XGBoost یک کتابخانه یادگیری ماشین منبع باز محبوب است که می تواند برای حل انواع مشکلات پیش بینی استفاده شود. در اینجا نحوه استفاده از XGBoost با InfluxDB آورده شده است.

XGBoost یک کتابخانه یادگیری ماشین منبع باز است که الگوریتم های تقویت گرادیان توزیع شده بهینه را پیاده سازی می کند. XGBoost از پردازش موازی برای عملکرد سریع استفاده می کند، مقادیر از دست رفته را به خوبی مدیریت می کند، در مجموعه داده های کوچک عملکرد خوبی دارد و از برازش بیش از حد جلوگیری می کند. همه این مزایا XGBoost را به یک راه حل محبوب برای مشکلات رگرسیون مانند پیش بینی تبدیل می کند.

پیش‌بینی یک وظیفه حیاتی برای همه انواع اهداف تجاری است، مانند تجزیه و تحلیل پیش‌بینی‌کننده، نگهداری پیش‌بینی‌کننده، برنامه‌ریزی محصول، بودجه‌بندی، و غیره. بسیاری از مشکلات پیش‌بینی یا پیش‌بینی شامل داده‌های سری زمانی می‌شوند. این امر XGBoost را به یک همراه عالی برای InfluxDB، پایگاه داده سری زمانی منبع باز تبدیل می کند.

در این آموزش با نحوه استفاده از بسته پایتون برای XGBoost آشنا خواهیم شد. برای داده های پیش بینی از پایگاه داده سری زمانی InfluxDB. ما همچنین از کتابخانه کلاینت InfluxDB Python برای پرس و جو از داده ها از InfluxDB و تبدیل داده ها به Pandas DataFrame برای تسهیل کار با داده های سری زمانی. سپس پیش‌بینی خود را انجام می‌دهیم.

من همچنین با جزئیات بیشتر به مزایای XGBoost خواهم پرداخت.

نیازها

این آموزش بر روی یک سیستم macOS با Python 3 نصب شده از طریق Homebrew اجرا شد. توصیه می‌کنم ابزارهای اضافی مانند virtualenv، pyenv، یا conda-env برای ساده سازی نصب پایتون و کلاینت. در غیر این صورت، شرایط کامل به شرح زیر است:

  • influxdb-client = 1.30.0
  • پاندا = ۱.۴.۳
  • xgboost >= ۱.۷.۳
  • influxdb-client >= ۱.۳۰.۰
  • پانداها >= ۱.۴.۳
  • matplotlib >= ۳.۵.۲
  • sklearn >= ۱.۱.۱

این آموزش همچنین فرض می‌کند که شما یک حساب سطح رایگان InfluxDB cloud دارید و یک سطل ایجاد کرد و یک توکن ایجاد کرد. می‌توانید یک سطل را به‌عنوان یک پایگاه داده یا بالاترین سطح سلسله مراتبی سازمان داده‌ها در نظر بگیرید. InfluxDB. برای این آموزش ما یک سطل به نام NOAA ایجاد خواهیم کرد.

درخت تصمیم، جنگل‌های تصادفی، و افزایش گرادیان

برای درک اینکه XGBoost چیست، باید درخت‌های تصمیم، جنگل‌های تصادفی و تقویت گرادیان را درک کنیم. درخت تصمیم نوعی روش یادگیری نظارت شده است که از یک سری تست بر روی یک ویژگی تشکیل شده است. هر گره یک آزمایش است و همه گره ها در یک ساختار فلوچارت سازماندهی شده اند. شاخه ها شرایطی را نشان می دهند که در نهایت تعیین می کنند کدام برگ یا برچسب کلاس به داده های ورودی اختصاص داده شود.

xboost influxdb 01

درخت تصمیم برای تعیین بارندگی از تصمیم< a href="https://towardsdatascience.com/decision-tree-in-machine-learning-e380942a4c96" rel="nofollow"> درخت در یادگیری ماشین. ویرایش شده تا اجزای درخت تصمیم را نشان دهد: برگ ها، شاخه ها و گره ها.

مایکروسافت فابریک از دریاچه داده به پلتفرم کاربردی تکامل می یابد

اصل راهنما در پشت درختان تصمیم، جنگل های تصادفی، و تقویت گرادیان این است که گروهی از “یادگیرندگان ضعیف” یا طبقه بندی کننده ها به طور جمعی پیش بینی های قوی انجام می دهند.

یک جنگل تصادفی شامل چندین درخت تصمیم است. در جایی که هر گره در یک درخت تصمیم یک یادگیرنده ضعیف در نظر گرفته می شود، هر درخت تصمیم در جنگل یکی از بسیاری از یادگیرندگان ضعیف در یک مدل جنگل تصادفی در نظر گرفته می شود. معمولاً همه داده‌ها به‌طور تصادفی به زیر مجموعه‌ها تقسیم می‌شوند و از درخت‌های تصمیم‌گیری مختلف عبور می‌کنند.

تقویت گرادیان با استفاده از درخت‌های تصمیم‌گیری و جنگل‌های تصادفی مشابه هستند، اما از نظر ساختاری متفاوت هستند. درخت‌های تقویت‌شده با گرادیان همچنین حاوی جنگلی از درخت‌های تصمیم هستند، اما این درخت‌ها به صورت افزودنی ساخته می‌شوند و همه داده‌ها از میان مجموعه‌ای از درخت‌های تصمیم عبور می‌کنند. (در بخش بعدی در این مورد بیشتر توضیح می دهیم.) درختان با گرادیان تقویت شده ممکن است دارای مجموعه ای از درختان طبقه بندی یا رگرسیون باشند. درختان طبقه بندی برای مقادیر گسسته (مانند گربه یا سگ) استفاده می شوند. درختان رگرسیون برای مقادیر پیوسته (مثلاً ۰ تا ۱۰۰) استفاده می‌شوند.

XGBoost چیست؟

تقویت گرادیان یک الگوریتم یادگیری ماشینی است که برای طبقه بندی و پیش بینی استفاده می شود. XGBoost فقط یک نوع افراطی از افزایش گرادیان است. از این جهت که می تواند با ظرفیت پردازش موازی، تقویت گرادیان را به طور موثرتری انجام دهد. نمودار زیر از مستندات XGBoost نشان می‌دهد که چگونه می‌توان از افزایش گرادیان برای پیش‌بینی اینکه آیا یک بازی ویدیویی را دوست دارد یا خیر، استفاده کرد.

xboost influxdb 02

از دو درخت برای تصمیم گیری در مورد اینکه آیا یک فرد احتمالاً از یک بازی ویدیویی لذت می برد یا خیر استفاده می شود. امتیاز برگ از هر دو درخت اضافه می شود تا مشخص شود که کدام فرد به احتمال زیاد از بازی ویدیویی لذت خواهد برد.

برای اطلاعات بیشتر به معرفی درختان تقویت شده در مستندات XGBoost مراجعه کنید. درباره نحوه عملکرد درخت‌های تقویت‌شده با گرادیان و XGBoost.

برخی از مزایای XGBoost:

  • درک نسبتا آسان است.
  • روی داده‌های کوچک، ساختاریافته و منظم با ویژگی‌های کم به خوبی کار می‌کند.

برخی از معایب XGBoost:

  • مستعد به تناسب بیش از حد و حساس به موارد پرت. ممکن است ایده خوبی باشد که از یک نمای واقعی از داده های سری زمانی خود برای پیش بینی با XGBoost استفاده کنید.
  • در داده‌های پراکنده یا بدون نظارت عملکرد خوبی ندارد.

پیش‌بینی‌های سری زمانی با XGBoost

ما از حسگر هوا استفاده می‌کنیم مجموعه داده نمونه که با InfluxDB از جعبه خارج می شود. این مجموعه داده حاوی داده های دما از چندین سنسور است. ما در حال ایجاد یک پیش‌بینی دما برای یک سنسور هستیم. داده ها به این شکل هستند:

بررسی nbdev v2: نوت بوک های Jupyter سازگار با Git

xboost influxdb 03

از کد Flux زیر برای وارد کردن مجموعه داده و فیلتر برای سری زمانی استفاده کنید. (Flux زبان درخواست InfluxDB است.)

 
import "join"
import "influxdata/influxdb/sample"
//dataset is regular time series at 10 second intervals
data = sample.data(set: "airSensor")
  |> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")

جنگل‌های تصادفی و تقویت گرادیان را می‌توان برای پیش‌بینی سری‌های زمانی استفاده کرد، اما لازم است که داده‌ها برای یادگیری نظارت‌شده تغییر داده شوند. این بدان معناست که ما باید داده‌هایمان را در رویکرد پنجره کشویی یا روش تاخیر برای تبدیل داده‌های سری زمانی به مجموعه یادگیری نظارت شده. ما می توانیم داده ها را با Flux نیز آماده کنیم. در حالت ایده‌آل، ابتدا باید مقداری تجزیه و تحلیل خودهمبستگی را برای تعیین تاخیر بهینه برای استفاده انجام دهید. برای اختصار، ما فقط داده ها را با یک بازه زمانی منظم با کد Flux زیر تغییر می دهیم.

 
import "join"
import "influxdata/influxdb/sample"
data = sample.data(set: "airSensor")
  |> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")
shiftedData = data
  |> timeShift(duration: 10s , columns: ["_time"] )
join.time(left: data, right: shiftedData, as: (l, r) => ({l with data: l._value, shiftedData: r._value}))
  |> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"]) 

xboost influxdb 04

اگر می‌خواهید داده‌های تأخیر بیشتری را به ورودی مدل خود اضافه کنید، می‌توانید به جای آن از منطق Flux زیر پیروی کنید.


import "experimental"
import "influxdata/influxdb/sample"
data = sample.data(set: "airSensor")
|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")

shiftedData1 = data
|> timeShift(duration: 10s , columns: ["_time"] )
|> set(key: "shift" , value: "1" )

shiftedData2 = data
|> timeShift(duration: 20s , columns: ["_time"] )
|> set(key: "shift" , value: "2" )

shiftedData3 = data
|> timeShift(duration: 30s , columns: ["_time"] )
|> set(key: "shift" , value: "3")

shiftedData4 = data
|> timeShift(duration: 40s , columns: ["_time"] )
|> set(key: "shift" , value: "4")

union(tables: [shiftedData1, shiftedData2, shiftedData3, shiftedData4])
|> pivot(rowKey:["_time"], columnKey: ["shift"], valueColumn: "_value")
|> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"])
// remove the NaN values
|> limit(n:360)
|> tail(n: 356)

علاوه بر این، برای آموزش الگوریتم خود باید از اعتبار سنجی راه رفتن به جلو استفاده کنیم. این شامل تقسیم مجموعه داده به یک مجموعه آزمایشی و یک مجموعه آموزشی است. سپس مدل XGBoost را با XGBRegressor و با fit< روش /a>. در نهایت، ما از MAE (میانگین خطای مطلق) برای تعیین صحت پیش‌بینی‌هایمان استفاده می‌کنیم. برای یک تاخیر ۱۰ ثانیه، MAE 0.035 محاسبه می شود. ما می توانیم این را به این معنا تفسیر کنیم که ۹۶.۵ درصد از پیش بینی های ما بسیار خوب است. نمودار زیر نتایج پیش‌بینی‌شده ما از XGBoost را در برابر مقادیر مورد انتظار ما از تقسیم قطار/آزمایش نشان می‌دهد.

xboost influxdb 05

در زیر اسکریپت کامل آمده است. این کد عمدتاً از آموزش اینجا گرفته شده است.


import pandas as pd
from numpy import asarray
from sklearn.metrics import mean_absolute_error
from xgboost import XGBRegressor
from matplotlib import pyplot
from influxdb_client import InfluxDBClient
from influxdb_client.client.write_api import SYNCHRONOUS

# query data with the Python InfluxDB Client Library and transform data into a supervised learning problem with Flux
client = InfluxDBClient(url="https://us-west-2-1.aws.cloud2.influxdata.com", token="NyP-HzFGkObUBI4Wwg6Rbd-_SdrTMtZzbFK921VkMQWp3bv_e9BhpBi6fCBr_0-6i0ev32_XWZcmkDPsearTWA==", org="0437f6d51b579000")

# write_api = client.write_api(write_options=SYNCHRONOUS)
query_api = client.query_api()
df = query_api.query_data_frame('import "join"'
'import "influxdata/influxdb/sample"'
'data = sample.data(set: "airSensor")'
  '|> filter(fn: (r) => r._field == "temperature" and r.sensor_id == "TLM0100")'
'shiftedData = data'
  '|> timeShift(duration: 10s , columns: ["_time"] )'
'join.time(left: data, right: shiftedData, as: (l, r) => ({l with data: l._value, shiftedData: r._value}))'
  '|> drop(columns: ["_measurement", "_time", "_value", "sensor_id", "_field"])'
  '|> yield(name: "converted to supervised learning dataset")'
)
df = df.drop(columns=['table', 'result'])
data = df.to_numpy()

# split a univariate dataset into train/test sets
def train_test_split(data, n_test):
     return data[:-n_test:], data[-n_test:]

# fit an xgboost model and make a one step prediction
def xgboost_forecast(train, testX):
     # transform list into array
     train = asarray(train)
     # split into input and output columns
     trainX, trainy = train[:, :-1], train[:, -1]
     # fit model
     model = XGBRegressor(objective='reg:squarederror', n_estimators=1000)
     model.fit(trainX, trainy)
     # make a one-step prediction
     yhat = model.predict(asarray([testX]))
     return yhat[0]

# walk-forward validation for univariate data
def walk_forward_validation(data, n_test):
     predictions = list()
     # split dataset
     train, test = train_test_split(data, n_test)
     history = [x for x in train]
     # step over each time-step in the test set
     for i in range(len(test)):
          # split test row into input and output columns
          testX, testy = test[i, :-1], test[i, -1]
          # fit model on history and make a prediction
          yhat = xgboost_forecast(history, testX)
          # store forecast in list of predictions
          predictions.append(yhat)
          # add actual observation to history for the next loop
          history.append(test[i])
          # summarize progress
          print('>expected=%.1f, predicted=%.1f' % (testy, yhat))
     # estimate prediction error
     error = mean_absolute_error(test[:, -1], predictions)
     return error, test[:, -1], predictions

# evaluate
mae, y, yhat = walk_forward_validation(data, 100)
print('MAE: %.3f' % mae)

# plot expected vs predicted
pyplot.plot(y, label='Expected')
pyplot.plot(yhat, label='Predicted')
pyplot.legend()
pyplot.show()

نتیجه گیری

امیدوارم این پست وبلاگ به شما انگیزه دهد که از XGBoost و InfluxDB برای پیش بینی استفاده کنید. توصیه می‌کنم به مخزن زیر نگاهی بیندازید که شامل مثال‌هایی برای نحوه کار با بسیاری از الگوریتم‌ها است. در اینجا توضیح داده شده و InfluxDB برای پیش بینی و انجام تشخیص ناهنجاری.

Databricks منبع باز دریاچه دلتا لیک خود است

Anais Dotis-Georgiou یک مدافع توسعه دهنده برای InfluxData است که علاقه مند به زیبا کردن داده ها با استفاده از تجزیه و تحلیل داده ها، هوش مصنوعی و یادگیری ماشینی. او ترکیبی از تحقیقات، اکتشاف و مهندسی را به کار می گیرد تا داده هایی را که جمع آوری می کند به چیزی مفید، ارزشمند و زیبا تبدیل کند. هنگامی که او پشت صفحه نیست، می توانید او را در بیرون از خانه در حال کشیدن نقاشی، کشش، سوار شدن یا تعقیب توپ فوتبال بیابید.

New Tech Forum مکانی برای کاوش و بحث در مورد فناوری سازمانی نوظهور در عمق و وسعت بی سابقه ای فراهم می کند. انتخاب ذهنی است، بر اساس انتخاب ما از فناوری هایی که معتقدیم مهم هستند و برای خوانندگان InfoWorld بیشترین علاقه را دارند. InfoWorld وثیقه بازاریابی را برای انتشار نمی پذیرد و حق ویرایش تمام محتوای ارائه شده را برای خود محفوظ می دارد. همه سوالات را به newtechforum@infoworld.com ارسال کنید.