Regresión Lineal. Predicción de costos en stock de Google Inc con Machine Learning.

Veamos un ejercicio donde podré mostrarte las partes que involucran un algoritmo de machine learning supervizado llamado regresión lineal., que no es lo mismo que la clasificacion lineal pero involucra las fórmulas de gradient descent para levarse a cabo.

Bien cual es su diferencia, un ejemplo:

Regresión Lineal: Que temperatura habrá en las proximas horas?
Clasificación Lineal: Estará haciendo calor al rato o no?

Allá vamos: (Python 3 y librerías no se deben olvidar)

#forecasting

#Pandas librería muy buena para big data y data science

import pandas as pd
import quandl
import math, datetime
import numpy as np
from sklearn import preprocessing, cross_validation,svm
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from matplotlib import style

#esto solo es para ponerle estilo a las gráficas
style.use('ggplot')

#google stock in Quandl, importamos un archivo de google sobre precios
df = quandl.get('WIKI/GOOGL')

#Organizamos por etiqueta, no se fijen tanto en esto es solo organizar bien
# el stock en especifico(obtener el database del raw_data)
df = df[['Adj. Open','Adj. High','Adj. Low','Adj. Close','Adj. Volume',]]
#HL Percent
df['HL_PCT']= (df['Adj. Open'] - df['Adj. Close']) / df['Adj. Close'] * 100.0
#Percent change
df['PCT_change']= (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0

df = df[['Adj. Close','HL_PCT','PCT_change','Adj. Volume']]


#nuestra columna que ocuparemos será Adj close que es el precio del stock al final de la
#jornada de la bolsa, no podemos ocupar el open, o las otras clases porque simplemente o
#no tienen que ver con el precio, o como el open, es un precio de inicio que cambiará a lo #largo de la jornada en bolsa.
forecast_col = 'Adj. Close'
#tomamos todos los datos y le asignamos -99999 a los que no tengan valores o tengamos un #valor no numérico
df.fillna(value=-99999,inplace=True)  #just in case lose data  o un valor NaN

forecast_out = int(math.ceil(0.01*len(df))) #lo que equivale a 1% del total de dias 
#de la estancia de este stock por tanto nuestros datos son 100 y nuestro 1% es 0.001
#en este caso el 1% son 33 dias por el stock
#print("forecast out:",forecast_out)

#x es el feature, el atributo
df['label']= df[forecast_col].shift(-forecast_out)
X = np.array(df.drop(['label'],1)) #Quitamos la clase de nuestro atributo
#esto es hacer pronosticado del 1% de los datos
X = preprocessing.scale(X)                  #ojo: Aqui estandarizamos
X_lately = X[-forecast_out:]#partir el database X en 1% aqui
X= X[:-forecast_out:] #y 99% aqui

df.dropna(inplace=True)
#y es los labels, o clases, recuperamos la clase para poder determinar a futuro
y = np.array(df['label'])


#PARTIR EL DATASET X(99% DEL ORIGINAL) Y ASIGNAR 20% PARA TEST Y 80% PARA
#EL ENTRENAMIENTO
#training and testings
#Shuffle them, keeping x, y conected, it shoves them up
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,y,test_size=0.2)

#ENTRENAMIENTO
#clf es un nombre que le damos a la regresion linear, ojo n_jobs:-1 es trabajar
#con el multithreading en tu pc dependiendo de los nucleos de tu computador, el -1
#toma los disponibles.
#trabajando con el agoritmo de regresion
clf = LinearRegression(n_jobs=-1)  #podemos usar adentro: n_jobs=1, que nos dice cuantos #threads podemos usar
clf.fit(X_train,y_train)

#EXACTITUD
#Medimos la exactitud
accuracy = clf.score(X_test,y_test)
print("accuracy by LR:",accuracy)

#PRONOSTICO
#Ahora si hacemos el pronostico del stock de 30 dias
forecast_set = clf.predict(X_lately)
print("los precios predecidos del stock: ", forecast_set)
print("\nla exactitud y los dias son: ",accuracy,forecast_out)

#ORGANIZAR LOS DATOS POR FECHA PARA GRAFICARLOS
df['Forecast'] = np.nan
  
last_date = df.iloc[-1].name
last_unix = last_date.timestamp()  
#segundos del dia                 
one_day = 86400
next_unix = last_unix + one_day

for i in forecast_set:
    next_date = datetime.datetime.fromtimestamp(next_unix)
    next_unix += one_day
    df.loc[next_date] = [np.nan for _ in range(len(df.columns)-1)] + [i]
#ploteamos el open original
df['Adj. Close'].plot()

#ploteamos nuestra prediccion
df['Forecast'].plot(c='k')
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()                

Al graficar podemos dar zoom y veremos lo siguiente:


Aquí se observa en negro la predicción del% de la siguiente jornada y he aqui la posibilidad de tomar decisiones si vas a comprar acciones,etc. 

Chao!              
 

Comentarios

Entradas populares