آموزش پایتون: رگرسیون - پیش بینی و پیش گویی
خوش آمدید به بخش پنجم مبحث یادگیری ماشین از مجموعه آموزش Python. تا به اینجا، محتوای آموزشی رگرسیون را پوشش می دهد. پیش از این، ما داده ها را جمع آوری کرده ایم، آن ها کمی اصلاح شده، طبقه بندی شده آموزش داده و حتی طبقه بندی ها آزمون شده اند. در این قسمت، ما قصد داریم از طبقه بندی ها استفاده کنیم تا در واقع برخی از پیش بینی ها برای ما انجام شود. کد تا این لحظه که ما استفاده می کنیم به صورت زیر است:
import Quandl, math import numpy as np import pandas as pd from sklearn import preprocessing, cross_validation, svm from sklearn.linear_model import LinearRegression df = Quandl.get("WIKI/GOOGL") df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']] df['HL_PCT'] = (df['Adj. High'] - df['Adj. Low']) / df['Adj. Close'] * 100.0 df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0 df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']] forecast_col = 'Adj. Close' df.fillna(value=-99999, inplace=True) forecast_out = int(math.ceil(0.01 * len(df))) df['label'] = df[forecast_col].shift(-forecast_out) X = np.array(df.drop(['label'], 1)) X = preprocessing.scale(X) X = X[:-forecast_out] df.dropna(inplace=True) y = np.array(df['label']) X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2) clf = LinearRegression(n_jobs=-1) clf.fit(X_train, y_train) confidence = clf.score(X_test, y_test) print(confidence)
من تاکید می کنم که ایجاد یک مدل خطی با دقتی بیش از 95٪ درست نیست. هنوز موضوعات زیادی در نظر گرفته نشده است، به خصوص با شرکت های مختلف که مسیرهای مختلف قیمت را در طول زمان دارند. گوگل واقعا بسیار خطی است: بالا و راست. بسیاری از شرکت ها اینگونه نمی باشند، بنابراین این را در ذهن داشته باشید. اکنون، برای پیش بینی کردن، ما به برخی اطلاعات نیاز داریم. ما تصمیم گرفتیم که 1٪ از داده ها را پیش بینی کنیم، بنابراین ما می خواهیم یا حداقل "می توانیم" برای هر یک از 1٪ نهایی مجموعه داده پیش بینی کنیم. پس چه وقتی می توانیم این کار را انجام دهیم؟ وقتی که این داده ها را شناسایی کنیم؟ ما اکنون می توانیم آن را فراخوانی کنیم، اما اطلاعاتی را که ما در حال تلاش برای پیش بینی آن هستیم، در نظر نگیریم مانند داده های آموزشی. آیا ما فقط قبل از پردازش scale.scale () در برابر آخرین 1٪ آن را انجام می دهیم؟ روش مقیاس بر اساس تمام داده های شناخته شده ای است که به آن داده می شود. در حالت ایده آل، شما می توانید هر دو آموزش، آزمایش، و پیش بینی یا پیش گویی داده ها را، به شکل همه با هم مقیاس کنید. آیا این همیشه امکان پذیر است یا معقول می باشد؟ خیر. اگر شما می توانید این کار را انجام دهید، و در حال حاضر ما می توانیم این کار را انجام دهیم. داده های ما به اندازه کافی کوچک است و زمان پردازش به اندازه کافی کم است، بنابراین ما تمام داده ها را یکبار در پیش داده پردازیم و مقیاس می کنیم.
در بسیاری موارد، شما نمی توانید این کار را انجام دهید. تصور کنید اگر از حجمی معادل گیگابایت داده ها برای آموزش یک طبقه بندی استفاده می کنید. ممکن است چند روز طول بکشد تا طبقه بندی شما را آموزش کند، و نمی خواهید این کار را هر زمان که بخواهید پیش بینی کنید با این هزینه زمانی صورت دهید. به این ترتیب، ممکن است نیازی به هر چیزی نداشته باشید، یا ممکن است داده ها را به طور جداگانه مقیاس دهید. به طور معمول، شما می خواهید هر دو گزینه را آزمایش کنید و ببینید که بهترین موارد مورد شما چیست.
با توجه به این، اجازه دهید همه ردیف ها را از تعریف X به جلو برداریم:
X = np.array(df.drop(['label'], 1)) X = preprocessing.scale(X) X_lately = X[-forecast_out:] X = X[:-forecast_out] df.dropna(inplace=True) y = np.array(df['label']) X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2) clf = LinearRegression(n_jobs=-1) clf.fit(X_train, y_train) confidence = clf.score(X_test, y_test) print(confidence)
توجه داشته باشید که ابتدا تمام داده ها را پردازش می کنیم، سپس آن را تقسیم می کنیم. متغیر X_late ما دارای ویژگی های جدیدی است که ما پیش بینی می کنیم. همانطور که شما تا به حال باید ببینید، تعریف یک طبقه بندی، آموزش و آزمایش بسیار ساده بود. پیش بینی نیز فوق العاده آسان است:
forecast_set = clf.predict(X_lately)
این پیش بینی یک آرایه ای از پیش بینی ها است، نشان می دهد که نه تنها شما می توانید فقط یک پیش بینی را جستجو کنید، همچنین شما می توانید بسیاری را در یک زمان دنبال کنید. برای دیدن آنچه که تاکنون انجام داده ایم به کد زیر توجه کنید و از آن بهره گیری فرمایید:
print(forecast_set, confidence, forecast_out)
[ 745.67829395 737.55633261 736.32921413 717.03929303 718.59047951 731.26376715 737.84381394 751.28161162 756.31775293 756.76751056 763.20185946 764.52651181 760.91320031 768.0072636 766.67038016 763.83749414 761.36173409 760.08514166 770.61581391 774.13939706 768.78733341 775.04458624 771.10782342 765.13955723 773.93369548 766.05507556 765.4984563 763.59630529 770.0057166 777.60915879] 0.956987938167 30
بنابراین این پیش بینی های ماست. اکنون این صورت اساسی پیش بینی شما است که انجام می شود، اما ما می توانیم در تجسم این اطلاعات کار کنیم. قیمت سهام روزانه 5 روز است و در آخر هفته هیچ قیمتی وجود ندارد. من این واقعیت را به رسمیت می شناسم، اما ما قصد داریم همه چیز را ساده نگه داریم و هر پیش بینی را به صورت یک روزه قرار دهیم. اگر می خواهید سعی کنید در شکاف آخر هفته کار کنید (تعطیلات را فراموش نکنید) برای آن بروید، اما ما آن را ساده نگه خواهیم داشت. برای شروع، ما چندین وارد کننده جدید اضافه خواهیم کرد:
import datetime import matplotlib.pyplot as plt from matplotlib import style
ما تاریخ datetime را برای کار با اشیاء datetime، بسته matplotlib's pyplot برای گرافیک و روشی برای ساخت نمودارهای مناسب تر بکار می بریم. بیایید یک سبک را تنظیم کنیم:
style.use('ggplot')
در گام بعد، ما قصد داریم یک ستون جدید به فریم dataframe اضافه کنیم، ستون پیش بینی:
df['Forecast'] = np.nan
ما ابتدا ارزش را به عنوان NaN تنظیم می کنیم، اما به برخی از آنها به زودی خواهیم پرداخت. ما گفتیم قصد داریم پیش بینی ها را فقط برای فردا نهایی کنیم (به یاد بیاورید که ما 10٪ از آینده را پیش بینی می کنیم و 10٪ از داده هایمان را برای این کار حفظ کردیم، بنابراین می توانیم بلافاصله پیش بینی کنیم از -10٪ دارای داده هایی است که ما می توانیم 10٪ را پیش بینی کنیم و پیش بینی بعدی باشد). ما باید ابتدا آخرین روز را در فریم data ببریم و هر یک از پیش بینی های جدید را به یک روز جدید اختصاص دهیم. شروع خواهیم کرد:
last_date = df.iloc[-1].name last_unix = last_date.timestamp() one_day = 86400 next_unix = last_unix + one_day
حالا ما روز بعد می خواهیم استفاده کنیم، و یک روز روزانه 86،400 ثانیه است. حالا پیش بینی را به فرمت data موجود اضافه می کنیم:
for i in forecast_set: next_date = datetime.datetime.fromtimestamp(next_unix) next_unix += 86400 df.loc[next_date] = [np.nan for _ in range(len(df.columns)-1)]+[i]
بنابراین در اینجا همه کار در حال انجام است از طریق مجموعه ای از پیش بینی، گرفتن هر پیش بینی و روز، و سپس تنظیم این ارزش ها در فریم داده (ایجاد ویژگی های آینده "NaNs") آن هم به صورت تکرار. کد آخرین خط به سادگی تمام ستون های اول را می گیرد، آنها را به NaN ها می بندند، و سپس ستون نهایی هر چیزی است (پیش بینی در این مورد). من تصمیم گرفتم این حلقه را برای این کار انجام دهم به طوری که اگر تغییر فرمت داده ها و ویژگی ها را در نظر داشته باشیم، کد هنوز هم می تواند کار کند.
df['Adj. Close'].plot() df['Forecast'].plot() plt.legend(loc=4) plt.xlabel('Date') plt.ylabel('Price') plt.show()
کد کامل تا این مرحله:
import Quandl, math import numpy as np import pandas as pd from sklearn import preprocessing, cross_validation, svm from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt from matplotlib import style import datetime style.use('ggplot') df = Quandl.get("WIKI/GOOGL") df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']] df['HL_PCT'] = (df['Adj. High'] - df['Adj. Low']) / df['Adj. Close'] * 100.0 df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0 df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']] forecast_col = 'Adj. Close' df.fillna(value=-99999, inplace=True) forecast_out = int(math.ceil(0.01 * len(df))) df['label'] = df[forecast_col].shift(-forecast_out) X = np.array(df.drop(['label'], 1)) X = preprocessing.scale(X) X_lately = X[-forecast_out:] X = X[:-forecast_out] df.dropna(inplace=True) y = np.array(df['label']) X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2) clf = LinearRegression(n_jobs=-1) clf.fit(X_train, y_train) confidence = clf.score(X_test, y_test) forecast_set = clf.predict(X_lately) df['Forecast'] = np.nan last_date = df.iloc[-1].name last_unix = last_date.timestamp() one_day = 86400 next_unix = last_unix + one_day for i in forecast_set: next_date = datetime.datetime.fromtimestamp(next_unix) next_unix += 86400 df.loc[next_date] = [np.nan for _ in range(len(df.columns)-1)]+[i] df['Adj. Close'].plot() df['Forecast'].plot() plt.legend(loc=4) plt.xlabel('Date') plt.ylabel('Price') plt.show()
نتیجه در شکل بالا آمده است.
در اینجا شما آن بخش را داشته اید، اکنون یک روش معقول و شایسته برای پیش بینی قیمت سهام در آینده وجود دارد! در آموزش بعدی ما قصد داریم تا رگرسیون را با اطلاعاتی درباره صرفه جویی در طبقه بندی ها و همچنین استفاده از میلیون ها دلار ارزش محاسباتی برای چند دلار صرف کنیم.
تهیه از: بهزاد سرهادی
کلیه سرفصل های برنامه نویسی: اینجا کلیک کنید.
شناسه تلگرام مدیر سایت: SubBasin@
نشانی ایمیل: behzadsarhadi@gmail.com
(سوالات تخصصی را در گروه تلگرام ارسال کنید)
_______________________________________________________
نظرات (۰)