آموزش پایتون: رگرسیون - پیش بینی و پیش گویی :: بیسین - سایت تخصصی مهندسی آب

عضويت در خبرنامه ايـميـل پايگاه بيسيــن - عضويت پس از کليک بر روي لينک فعال سازي که براي شما ارسال خواهد شد تکميل مي شود




آموزش پایتون: رگرسیون - پیش بینی و پیش گویی

خوش آمدید به بخش پنجم مبحث یادگیری ماشین از مجموعه آموزش 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()

نتیجه در شکل بالا آمده است.

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


تهیه از: بهزاد سرهادی

 کلیه سرفصل های برنامه نویسی: اینجا کلیک کنید.












نظرات (۰)

فرم ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

درباره بهترين هاي بيسيـــن بدانيد...

Bird

يکي از مهمترين اهداف اين سايت تهيه آموزش هاي روان از ابزارهاي کاربردي علوم آب است.

اهميت مطالعات محيطي با ابزارهاي نوين در چيست؟

امروز با فارغ التحصيلي جمع کثير دانشجويان سالهاي گذشته و حال، با گذر از کمي گرايي ديگر صرف وجود مدارک دانشگاهي حرف اول را در بازار کار نمي زند؛ بلکه سنجش ديگري ملاک؛ و شايسته سالاري به ناچار! باب خواهد شد. يکي از مهم ترين لوازم توسعه علمي در هر کشور و ارائه موضوعات ابتکاري، بهره گيري از ابزار نوين است، بيسين با همکاري مخاطبان مي تواند در حيطه علوم آب به معرفي اين مهم بپردازد.

جستجو در بيسين
سایت مهندسی آب

بیسین - سایت تخصصی مهندسی آب

سایت بیسین با معرفی مهم ترین و کاربردی ترین نرم افزارها و مدل های شبیه سازی در حیطه مهندسی آب، تلاش به تهیه خدمات یکپارچه و محلی از محاسبات هیدرولوژیکی و هیدرولیکی می کند

اطلاعات سايت

  • www.Basin.ir@gmail.com
  • بهزاد سرهادي
  • شناسه تلگرام: Basin_Ir_bot
  • شماره واتساپ: 09190622992-098
  • شماره تماس: 09190622992-098

W3Schools

W3Schools