آموزش پایتون: رگرسیون - یادگیری ماشین و آزمون
خوش آمدید به بخش چهارم از آموزش ماشین با سری آموزش Python. در آموزش های قبلی، داده های اولیه را به دست آوردیم، ما آن را به صورت دلخواهی تغییر دادیم و دستکاری و اصلاح کردیم، و سپس شروع به تعریف ویژگی هایمان کردیم. Scikit-Learn اساسا نیازی به کار با Pandas و فریم های داده ندارد، من فقط ترجیح می دهم اطلاعات مربوط به آن را مدیریت کنم، زیرا سریع و کارآمد است. در عوض، Scikit-learn اساسا نیاز به آرایه های numpy دارد. داده های فرعی پانداها به راحتی می توانند به آرایه های NumPy تبدیل شوند، بنابراین فقط برای انجام کار برای ما صورت می پذیرد.
کد ما تا این لحظه اینگونه است:
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") print(df.head()) #print(df.tail()) 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']] print(df.head()) 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)
سپس هر نوع اطلاعات NaN را از فرمت داده حذف خواهیم کرد:
df.dropna(inplace=True)
این یک استاندارد معمولی با یادگیری ماشین در کد خواهد بود؛ که برای تعریف X (مقدار X)، به عنوان ویژگی ها، و Y (حروف کوچک Y) به عنوان برچسب که مربوط به ویژگی ها است. به همین ترتیب، ما می توانیم ویژگی ها و برچسب های خود را به صورت زیر تعریف کنیم:
X = np.array(df.drop(['label'], 1)) y = np.array(df['label'])
در بالا، آنچه که ما انجام می دهیم، X (ویژگی ها) تعریف شده است، به عنوان فرمت تمام داده های ما به استثنای ستون برچسب، که تبدیل به یک آرایه numpy خواهد شد. ما این کار را با استفاده از روش .drop انجام می دهیم که می تواند به فریم های dataframe اعمال شود که یک فریم داده جدید را به ارمغان می آورد. در گام بعد، ما متغیر y خود را، که برچسب ما است، به عنوان برچسب ستون در فریم داده، به آرایه numpy تبدیل می کنیم.
ما می توانیم آن را در این مورد به هیمن صورت رها کنیم و به آموزش و آزمایش ادامه دهیم، اما قصد داریم تا پیش پردازش انجام دهیم. به طور کلی، شما می خواهید ویژگی های در یادگیری ماشین در محدوده 1 تا 1 باشد. این ممکن است هیچ نتیجه خاصی نداشته باشد اما معمولا پردازش را تسریع می کند و همچنین می تواند با دقت فرآیند را راهنمایی کند. از آنجا که این محدوده به شدت مورد استفاده قرار می گیرد، در ماژول پیش پردازش Scikit-Learn موجود است. برای استفاده از این امر، شما می توانید قبل از پردازش. مقیاس را به متغیر X خود بدهید:
X = preprocessing.scale(X)
در گام بعد، برچسب را ایجاد کنید:
y = np.array(df['label'])
در حال حاضر آموزش و آزمایش به عمل می آید. به این ترتیب کد 75٪ از اطلاعات شما را می گیرد و از این برای آموزش طبقه بندی یادگیری دستگاه استفاده می کند. سپس 25٪ باقی مانده از داده های شما را می گیرد و طبقه بندی را آزمایش می کند. از آنجا که این داده های نمونه شماست، باید ویژگی ها و برچسب های شناخته شده ای داشته باشید. بنابراین، اگر شما در 25٪ از داده های خود تست کنید، می توانید نوعی دقت و قابلیت اطمینان را بدست آورید، که اغلب به آن اعتماد می گویند. راه های زیادی برای انجام این کار وجود دارد، اما احتمالا بهترین راه استفاده از یک ساخت در cross_validation ارائه شده است، زیرا اطلاعات شما را تغییر می دهد. کد برای انجام این کار به صورت زیر است:
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2)
بازگشت به اینجا مجموعه ای از ویژگی های آموزشی، مجموعه ای از ویژگی های آزمایش، مجموعه ای از برچسب های آموزشی و مجموعه ای از برچسب ها را آزمایش می کند. اکنون ما آماده تعریف طبقه بندی هستیم. طبقه بندی های زیادی وجود دارد که به طور کلی از طریق Scikit-Learn یاد گرفته می شود و حتی تعدادی برای رگرسیون وجود دارد. ما در این مثال یک زوج را نشان می دهیم، اما در حال حاضر، از Regression Vector Support از بسته svm Scikit-Learn استفاده خواهیم کرد:
clf = svm.SVR()
ما فقط از تمام پیش فرض ها استفاده می کنیم تا همه چیز را ساده در اینجا نگه داریم، اما می توانید در مورد رگرسیون بردار پشتیبانی، در اسکریپت sklearn.svm.SVR یاد بگیرید.
هنگامی که classifer را تعریف می کنید، آماده هستیم که آن را آموزش دهیم. با Scikit-Learn) sklearn)، شما را با آموزش .fit به صورت زیر خواهید داشت:
clf.fit(X_train, y_train)
در اینجا، ویژگی های آموزشی و برچسب های آموزشی ما را در بر می گیرد. طبقه بندی ما در حال حاضر آموزش دیده است.
confidence = clf.score(X_test, y_test)
به این ترتیب تست شده و سپس:
print(confidence)
0.960075071072
بنابراین در اینجا می توانیم دقت را حدود 96٪ ببینیم. اکنون طبقه بندی دیگری را امتحان می کنیم، این بار با استفاده از LinearRegression و استفاده از sklearn:
clf = LinearRegression()
0.963311624499
شاید این کد کمی بهتر است، اما اساسا همان ویژگی قبلی را دارا است. بنابراین چگونه کاربر می تواند بداند که کدام الگوریتم را انتخاب کند؟ بعد از مدتی، آنچه که در اکثر موقعیت ها کار می کند استفاده می شود و چیزی تغییر نمی کند. شما همچنین می توانید چک کنید: انتخاب برآوردگر درست از وب سایت scikit-learn. این می تواند به شما کمک کند که از برخی گزینه های اساسی استفاده کنید. اگر افرادی که از یادگیری دستگاه استفاده می کنند اغلب از شما سوال می کنند، این انتخاب واقعا سعی و خطا است. شما تعدادی از الگوریتم ها را امتحان کنید و به سادگی با یکی که بهترین کار را انجام می دهد به توسعه کد بپردازید. چیز دیگری که باید توجه داشته باشید این است که برخی از الگوریتم ها باید به صورت خطی اجرا شوند، و برخی نه. به هر حال، رگرسیون خطی را با نیاز به اجرای خطی اشتباه نگیرید. شاید اکنون این سوال پیش آید که پس این همه تشریحات چیست؟ برخی از الگوریتم های یادگیری دستگاه در اینجا یک مرحله را در یک زمان پردازش می کنند، بدون هیچ موضوعی، دیگران می توانند از هسته های CPU شما استفاده کنند. شما می توانید مقدار زیادی از هر الگوریتم را بیاموزید تا دریابید کدامیک چگونه است و یا شما می توانید مستندات را ببینید و پارامتر n_jobs را جستجو کنید. اگر در آن n_jobs باشد، شما الگوریتمی دارید که می تواند برای عملکرد بالا رشته شود. اگر نه، شانس کمتری وجود خواهد داشت. بنابراین، اگر شما مقدار زیادی داده را پردازش می کنید، یا نیاز دارید که داده های متوسط را پردازش کنید، اما با سرعت بسیار بالا، پس می خواهید فرمی رشته ای داشته باشید. اجازه دهید دو الگوریتم ما را بررسی کنیم.
اکنون که به دنبال اسناد sklearn.svm.SVR هستید و از طریق پارامترها، n_jobs را می بینید؟ من نه. بنابراین نه، هیچ موضوعی اینجا نیست همانطور که می بینید، براساس داده های کوچک ما، تفاوت بسیار کمی وجود دارد، اما، با وجود مثلا حدود 20 مگابایت داده، این شرایط می تواند تفاوت بزرگی ایجاد کند. در گام بعد بگذارید الگوریتم LinearRegression را بررسی کنیم. آیا در اینجا n_jobs را می بینید؟ بله، بنابراین، در اینجا، می توانید دقیقا مشخص کنید کدامیک از موضوعات مورد نظر را می خواهید. اگر مقدار 1- را برای مقدار قرار دهید، الگوریتم از تمام موضوعات موجود استفاده می کند.
برای انجام این کار:
clf = LinearRegression(n_jobs=-1)
همه چیز درست هست، در حالی که چنین مورد نادری (بر پایه اسناد) را انجام می دهید؛ اجازه دهید توجه شما را به این واقعیت جلب کنم که فقط به دلیل اینکه الگوریتم های یادگیری ماشین با پارامترهای پیش فرض کار می کنند، به این معنا نیست که شما فقط می توانید آنها را نادیده بگیرید. به عنوان مثال، اجازه بکارگیری دوباره svm.SVR. SVR که رگرسیون بردار پشتیبانی است بدهید، که نوعی معماری هنگام انجام یادگیری ماشین خواهد بود. من به شدت هر کسی که علاقه مند به یادگیری بیشتر برای تحقیق در مورد موضوع و یادگیری از افرادی که بسیار تحصیل کرده تر از من در اصول اجرایی هستند را تشویق می کنم. به هر حال، من بهترین کار خود را برای توضیح مواردی ساده در اینجا، که تخصص اصلی من نیست ارائه دادم. با این حال، با برگشت به موضوع. برای مثال svm.SVR یک پارامتر وجود دارد که هسته است. این چه تفکری است؟ یک هسته را مانند یک تغییر در برابر داده های خود در نظر بگیرید. این روش شدت است، و منظور من از شدت، ساده کردن اطلاعات شما می باشد. این باعث می شود پردازش بسیار سریعتر انجام شود. در مورد svm.SVR، که به طور پیش فرض rbf است، یک نوع هسته می باشد. شما چند گزینه دیگر دارید. اسناد را بررسی کنید، شما دارای صورت خطی، poly، rbf، sigmoid، precomputed یا قابل ترکیب هستید. دوباره، درست مثل پیشنهاد برای امتحان الگوریتم های مختلف ML که می توانند آنچه را که می خواهید انجام دهند، هسته را امتحان کنید. بیایید چند نمونه انجام دهیم:
for k in ['linear','poly','rbf','sigmoid']: clf = svm.SVR(kernel=k) clf.fit(X_train, y_train) confidence = clf.score(X_test, y_test) print(k,confidence)
خطی 0.960075071072
چندضلعی 0.63712232551 پلی
شعاعی 0.802831714511
سیگماید 0.125347960903
همانطور که می بینیم، کرنل خطی بهترین نتیجه را انجام داد، از طریق rbf و سپس چندضلعی، بهترین کار را انجام داد و سپس sigmoid به راحتی دارای خطا بود و قطعا باید از تیم خارج شود.
بنابراین در داده های ما اینجا آموزش صورت دیده و آزمایش شکل گرفت. بگذارید بگوییم ما در این لحظه حدود 71 درصد مطمئن هستیم، پس اکنون چه کارهایی باید انجام دهیم؟ اکنون می خواهیم پیش رویم و پیش بینی کنیم، این چیزی است که ما در آموزش بعدی پوشش خواهیم داد.
تهیه از: بهزاد سرهادی
کلیه سرفصل های برنامه نویسی: اینجا کلیک کنید.
شناسه تلگرام مدیر سایت: SubBasin@
نشانی ایمیل: behzadsarhadi@gmail.com
(سوالات تخصصی را در گروه تلگرام ارسال کنید)
_______________________________________________________
نظرات (۰)