Ֆոնդային շուկան բորսաների բազմազանություն է, որտեղ վաճառվող ընկերությունների բաժնետոմսերը կարելի է գնել և վաճառել: Նման ֆինանսական գործարքներն իրականացվում են ինստիտուցիոնալացված պաշտոնական փոխանակումների միջոցով [1]:
Փորձելով կատարելագործել իմ հմտությունները ոլորտում՝ կատարելով անձնական նախագծեր, ես աշխատեցի ժամանակային շարքերի տվյալների կանխատեսման խնդրի վրա՝ օգտագործելով Tesla ֆոնդային շուկայի արժեքները:
Ընդհանուր առմամբ LSTM և այլ պարբերական նեյրոնային ցանցեր օգտագործվում են ժամանակային շարքերի տվյալների համար: Բայց ես ուզում էի պատասխանել կոնկրետ այս հարցին. Կարո՞ղ են ավելի պարզ մոդելները լավ արդյունքներ ապահովել: Արդյո՞ք անհրաժեշտ է կիրառել խորը ուսուցման ճարտարապետություններ:
Եթե դուք տվյալների գիտության սկսնակ եք, ինչպիսին ես եմ, ապա սա նախագիծ է ձեզ համար: Եթե ձեր նպատակն է կեղտոտել ձեր ձեռքերը, լուծեք իրական խնդիրները: Աշխատեք ձեր սեփական նախագծերի վրա, ապա դա ձեզ օգտակար կլինի:
Այս նախագծի ավելի լավ հասկանալու հիմնական նախադրյալներն են.
- Տվյալների գիտության և մեքենայական ուսուցման տեսությունների հիմնական գիտելիքներ:
- Ծանոթություն python-ին և նրա EDA (հետախուզական տվյալների վերլուծություն) գրադարաններին, ինչպիսիք են Pandas, Numpy և Matplotlib:
- Տվյալների մոդելավորման համար Scikit-Learn-ի էական գործառույթների ըմբռնում
Այս մոտեցման նպատակն է կանխատեսել բաժնետոմսի ապագա փակման արժեքը ապագայում որոշակի ժամանակահատվածում: Այս նախագծի համար ես օգտագործեցի մի շարք ML մոդելներ՝ որոշելու համար, թե որն է ամենաշատը սովորել տվյալներից:
Սրանք այն քայլերն են, որոնք նկարագրում են կանխատեսման խողովակաշարը.
Տվյալների հավաքածուի ներմուծում և ամսաթվի սյունակի փոխարկում
Առաջին հերթին ներմուծեք անհրաժեշտ python գրադարանները տվյալների վիճաբանության համար։ Դրանից հետո օգտագործեք նրանց գործառույթների մեծ ցանկը՝ գործընթացն ավելի արագ և արդյունավետ դարձնելու համար:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import sklearn import seaborn as sn
Օգտագործված Տվյալների հավաքածուն ընկերության՝ Tesla-ի ֆոնդային շուկան է 2010 թվականից մինչև 2019 թվականը: Տվյալները շահարկելու լավագույն միջոցը CSV ֆայլը պանդաների տվյալների շրջանակում վերբեռնելն է: Dataframes-ը տվյալների վերլուծության հզոր գործիք է: Նրանք տրամադրում են տվյալների ներկայացման չափազանց պարզեցված ձև՝ առաջարկելու բազմաթիվ հնարավորություններով: Ամսաթիվ սյունակը փոխարկվել է DateTime ձևաչափի՝ կանխատեսումները հեշտությամբ կատարելու համար:
df = pd.read_csv("data/tesla.csv", low_memory = False, parse_dates=["Date"], infer_datetime_format=True)
Հետախուզական տվյալների վերլուծություն (EDA)
ML մոդելներին անհրաժեշտ է տվյալների աղբյուր, որը չունի բացակայող կամ թվային արժեքներ: Դասընթացի փուլից առաջ կարևոր է ստուգել որևէ բացակայող կամ կատեգորիկ արժեք:
# Checking for missing data df.isna().sum() # Checking for non-numerical data df.dtypes
Հիմնական տվյալների վիզուալիզացիայի գծապատկերներ
Հազարավոր տողեր պարունակող տվյալների շրջանակի ընթերցումը կարող է բավականին դժվար լինել: Էլ ուր մնաց դրանից պատկերացումներ կորզելը: Տվյալների վիզուալիզացիան կարևոր է տվյալների միտումները բացահայտելու և տվյալների վերաբերյալ պատկերացում կազմելու համար:
Այս նոթատետրում ստեղծվել են երկու տարբեր սյուժեներ։ Առաջին գծապատկերում դուք կարող եք համեմատել ամենաբարձր, ամենացածր, բացման և փակման արժեքների տարբեր արժեքները՝ արտաքին եզրեր փնտրելու համար: Երկրորդ գծապատկերը մոմակալ է, որը ցույց է տալիս յուրաքանչյուր սյունակի գծայինության արժեքները:
# Data visualization sns.set_theme(style= "whitegrid") fig, ax = plt.subplots(figsize = (20,10)) ax.plot(df.Date, df.Close, color = 'green', label = "Closing Value"); ax.plot(df.Date, df.Open, color='red', label = "Opening Value"); ax.plot(df.Date, df.High, color='blue', label="Highest Value"); ax.plot(df.Date, df.Low, color='yellow', label="Lowest Value"); ax.legend(loc='upper left' ,frameon=False);
# Candlestick plot df[["Open","Close","High","Adj Close"]].plot(kind="box",color ="red");
Տվյալների հարմարեցում
Ամսաթիվ ժամի պարամետրերի ավելացում
DateTime հատկանիշների արդյունահանումը կարևոր է ժամանակային շարքերի նախագծերում: Մտածեք դրա մասին, դրանք արժեքավոր տեղեկատվության հարուստ աղբյուր են և կարող են ձեզ որոշակի խորը պատկերացումներ տալ ձեռքի տակ եղած տվյալների վերաբերյալ: Դրանք կարևոր են, քանի որ դրանք ճկունություն են հաղորդում հատկանիշի ինժեներական քայլերին: Ավելացված հատկանիշներն են՝ տարին, ամիսը, օրը, տարվա օրը, շաբաթվա օրը և տարվա շաբաթը:
# Sorting the data frame by Date df2.sort_values(by=["Date"],inplace=True,ascending=True) df2.head() #Creating a function to add Datetime parameters for a better prediction def add_date_params(df,Date): """ Adding different Date time parameters for the time series DataFrame """ df["Year"] = df.Date.dt.year df["Month"] = df.Date.dt.month df["Day"] = df.Date.dt.day df["Day_Of_Year"] = df.Date.dt.dayofyear df["Week_Of_Year"] = df.Date.dt.isocalendar().week.astype(np.int64) # The day of the week with Monday=0 to Sunday=6 df["Day_Of_Week"] = df.Date.dt.dayofweek df.drop("Date",axis=1,inplace=True) return df
- Կրկնօրինակների որոնում
Սա գործառույթ է, որը կարող եք օգտագործել կրկնօրինակները հեռացնելու համար: Այսպիսով, ավելորդ և ավելորդ սյունակներ և արժեքներ: Նրանք կարող են շփոթել մոդելը, և այն կհամապատասխանի վերապատրաստման տվյալների վրա:
# A function to search for duplicates in any pandas DataFrame def getDuplicateColumns(df): ''' Get a list of duplicate columns ''' duplicateColumnNames = set() # Iterate over all the columns in dataframe for x in range(df.shape[1]): # Select column at index 'x'. col = df.iloc[:, x] # Iterate over all the columns in DataFrame from index (x+1) till the last column for y in range(x + 1, df.shape[1]): otherCol = df.iloc[:, y] # test if the two selected columns are equal if col.equals(otherCol): duplicateColumnNames.add(df.columns.values[y]) return list(duplicateColumnNames)
- Ստացված DataFrame-ը
Պատկերացրեք տվյալների շրջանակը՝ ստուգելու, թե արդյոք ճիշտ եք կատարել նախորդ քայլերը:
Կոռելացիոն մատրիցա
Հարաբերակցության մատրիցը ցույց է տալիս տվյալների շրջանակի հատկանիշների հարաբերակցությունը: Այն ձեզ տալիս է հարաբերակցություն մատրիցայի բոլոր հնարավոր զույգ արժեքների միջև: Այն կարող է օգնել ձեզ բացահայտել օրինաչափությունները և դրանց համաձայն որոշում կայացնել:
Այնուհետև պատկերացրեք այն Seaborn ջերմային քարտեզում: Ջերմային քարտեզները ապահովում են ստացված արժեքների ավելի հստակ և լավ պատկերացում:
# Creating a correlation matrix of the DataFrame correlation_matrix = df2.corr() correlation_matrix # Visualizing the Correlation Matrix in a Seaborn heatmap plt.style.use('fivethirtyeight') fig,ax = plt.subplots(figsize = (15,10)) ax = sns.heatmap(correlation_matrix,annot=True,cmap="YlGnBu",vmin=-1, vmax=1) ax.set_title("Correlation HeatMap", fontsize=20);
Մոդելավորում
Այս բաժնում նպատակն է կանխատեսել 2019 թվականի ֆոնդային շուկայի արժեքները: Կանխատեսումը հիմնված է Տվյալների հավաքածուի նախորդ տարիների արժեքների վրա՝ օգտագործելով առաջարկվող մոդելները:
Տվյալների բաժանում
Նպատակը 2019 թվականի փակման արժեքները կանխատեսելն է: Դրա համար անհրաժեշտ է դրանք առանձնացնել տվյալների հավաքածուի մնացած մասից: Այսպիսով, անհրաժեշտ է տվյալների բաժանման փուլ, տվյալները բաժանեք ուսուցման հավաքածուի, որը պարունակում է բոլոր տվյալները՝ հանած 2019 թվականը, և թեստային հավաքածու՝ 2019 թվականի արժեքներով: Գնացքներից և թեստային հավաքածուներից յուրաքանչյուրը բաժանված էր հատկանիշների (մուտքագրումների) և պիտակներ (ելքեր):
# Splitting the Data into training and test sets test_set = df2[df2.Year == 2019] train_set = df2[df2.Year !=2019] # Split data into X (features) and y (labels) X_train, y_train = train_set.drop("Close",axis=1), train_set.Close X_test, y_test = test_set.drop("Close",axis=1), test_set.Close X_train.shape, y_train.shape, X_test.shape, y_test.shape
Մոդելների ուսուցում
Մի քանի ML մոդելների համեմատության նախընտրելի պրակտիկան դրանք python բառարանում տեղադրելն է: Սա օգնում է ձեզ խուսափել նույն կոդը կրկնելուց: Դուք կարող եք օգտագործել baseline_models ֆունկցիան: Որպես պարամետրեր այն վերցնում է համապատասխան գնացքները և թեստային հավաքածուները և մոդելները: Այնուհետև դրանք կիրառեք ընտրված մոդելների վրա՝ մարզվելու և դրանցից յուրաքանչյուրը գնահատելու ֆոնդային շուկայի արժեքներով:
models = { 'RF': RandomForestRegressor(), 'KNN': KNeighborsRegressor(), 'Linear regression': LinearRegression(), 'SVM Regressor': SVR(), 'ADABOOST Regressor': AdaBoostRegressor(), 'XGB': XGBRegressor(), 'CatBoost': CatBoostRegressor(), 'BayesianRidge': linear_model.BayesianRidge() } # Creating a function to test several baseline methods at the same time def baseline_models (models,X_train,y_train,X_test,y_test): results = {} for modelname, model in models.items(): model.fit(X_train, y_train) # The metric used is r^2 results[modelname] = model.score(X_test, y_test) return results
Մոդելների արդյունքների պատկերացում
Նախորդ գործառույթով ստացված արդյունքները ավելի լավ հասկանալու համար: Դուք կարող եք օգտագործել գծապատկեր, որպեսզի պատկերացնեք ստացված միավորները յուրաքանչյուր մոդելի համար առանձին:
Հաջորդ հատվածի համար ընտրեք լավագույն 2 մոդելները՝ հիմնվելով բազային ուսուցման արդյունքների վրա՝ ավելի շատ թյունինգի համար:
Հիպերպարամետրի կարգավորում (RandomizedSearchCV-ով)
Մոդելի լռելյայն պարամետրերը չեն տրամադրի լավագույն ուսուցման և կանխատեսման տեմպերը: Այսպիսով, հիպերպարամետրային թյունինգը շատ կարևոր քայլ է ցանկացած մոդելի արդյունքները բարելավելու համար: Ընդհանուր պրակտիկա է պատահական որոնումը յուրաքանչյուր պարամետրի համար ֆիքսված արժեքների շարքից: Այնուհետև այն համատեղեք խաչաձև վավերացման հետ՝ ավելի ճիշտ արդյունքների համար:
Յուրաքանչյուր մոդելի համար առաջարկվող արժեքները վերախմբավորելու համար օգտագործեք python բառարան: Ստեղծեք նոր մոդելը նրանց հետ՝ օգտագործելով RandomizedSearchCV (param_distributions պարամետրը):
- Hyperparameter թյունինգ CatBoost մոդելի համար
CatB_grid = {"depth": np.arange(4,12,2), "learning_rate": np.arange(0.01,1,0.01), "iterations" : np.arange(20,100,10) } # Instantiate The CatBoost model with RandomizedSearchCV CatB_model = RandomizedSearchCV(CatBoostRegressor(), random_state=19, n_jobs = -1, param_distributions = CatB_grid, n_iter = 100, cv=5, verbose = True) # Fit the RandomizedSearchCV model CatB_model.fit(X_train,y_train)
- Հիպերպարամետրի կարգավորում RandomForestRegressor-ի համար
random_forest_grid ={ "n_estimators" : np.arange(10,100,10), "max_depth" : [None,3,5,10], "min_samples_split" : np.arange(2,20,2), "min_samples_leaf" : np.arange(1,20,2), "max_features" : [0.5,1, "sqrt" , "auto"], } Random_forest_model = RandomizedSearchCV(RandomForestRegressor(), random_state=19, n_jobs = -1, param_distributions = random_forest_grid, n_iter = 100, cv=5, verbose = True) # Fit the RandomizedSearchCV model Random_forest_model.fit(X_train,y_train)
Մոդելների կատարողականի գնահատում
Նախորդ քայլից արդյունահանված լավագույն պարամետրերը կրկին օգտագործվում են տվյալների ուսուցման և փորձարկման համար: Այս անգամ ավելի շատ գնահատման չափումներ կգործեն:
RMSLE-ը նախապես սահմանված ֆունկցիա չէ scikit-learn գրադարանում: Դուք կարող եք ստեղծել ձեր համապատասխան python ֆունկցիան, որը կոչվում է այն հաշվարկելու համար, երբ անհրաժեշտ լինի: Այնուհետև կարող եք օգտագործել RMSLE-ը, ի լրումն այլ չափումների, ինչպիսիք են MAE, MSE, R², RMSE և MSLE գնահատման համար: Evaluating_reg_models ֆունկցիան թույլ է տալիս օգտագործել դրանք բոլորը միասին:
# Creating an evaluation function for RMSLE def RMSLE(y_test,y_predicted): """ Calculates the RMSLE (Root Mean Squared Log Error) between model predictions and true values. """ return np.sqrt(mean_squared_log_error(y_test,y_predicted)) # Creating a function with several evaluation metrics def evaluating_reg_models(model): test_preds = model.predict(X_test) scores = {"MAE" : mean_absolute_error(y_test,test_preds), "RMSLE" : RMSLE(y_test,test_preds), "MSE" : mean_squared_error(y_test,test_preds), "R^2" : r2_score(y_test,test_preds), "RMSE": mean_squared_error(y_test,test_preds,squared=False), "MSLE": mean_squared_log_error(y_test,test_preds)} return scores evaluating_reg_models(CatBoost_best_model) evaluating_reg_models(Random_forest_best_model)
Հետևյալ աղյուսակը ցույց է տալիս 2 մոդելների արդյունքները՝ հիմնված մի քանի չափումների վրա: Արդյունքները ցույց են տալիս, որ RandomForestRegressor մոդելն ավելի լավ է գործել Tesla-ի պաշարների տվյալների վրա:
Առաջարկվող մոտեցման ավելի լավ հասկանալու համար կարող եք գտնել ամբողջական կոդը իմ Github ռեպո-ում: Դուք կգտնեք այլ առաջարկվող քայլեր, ինչպիսիք են հատկանիշի կարևորությունը:
Ի՞նչ է հաջորդը:
Հաջորդ քայլերը, որոնք դուք կարող եք դիտարկել, հետևյալն են.
- Կիրառելով GridsearchCV մոդելներին՝ ավելի լավ թյունինգի համար:
- Համեմատելով մեր մոդելներից ստացված արդյունքները խորը ուսուցման մոդելների հետ, ինչպիսիք են LSTM-ը կամ այլ RNN մոդելները:
- Ոչ այնքան կարևոր հատկությունների հեռացումը և մոդելների վերապատրաստումը կարող է շատ լավ փորձ լինել:
Գրողի մասին
Սանա Զորգուին տվյալների ձգտող գիտնական է: Միշտ անհամբեր սպասում եմ ոլորտում սովորելու և ավելին աճելուն: Խնդրում եմ կապվեք ինձ հետ LinkedIn-ում, եթե ցանկանում եք ավելին իմանալ իմ մասին կամ զրուցել:
Հաղորդագրություն InsiderFinance-ից
Շնորհակալություն մեր համայնքի մի մասը լինելու համար: Նախքան գնալը.
- 👏 Ծափահարեք պատմության համար և հետևեք հեղինակին 👉
- 📰 Դիտեք ավելի շատ բովանդակություն InsiderFinance Wire-ում
- 📚 Մասնակցեք մեր ԱՆՎՃԱՐ վարպետության դասին
- 📈 Բացահայտեք Հզոր առևտրային գործիքներ