Cómo resolver el problema de regresión lineal usando Python
En este artículo, programaremos mucho, pero antes de eso, presentemos el problema de ejemplo que resolveremos hoy.
1) Predecir el precio de la casa
Queremos predecir el valor de una casa específica en función del área de la casa.
2) Predice qué programa de televisión tendrá más espectadores la próxima semana
Flash y Arrow son mis programas de televisión favoritos. Quiero ver qué programa tendrá más espectadores la próxima semana.
3) Reemplazar los valores faltantes en el conjunto de datos
A menudo tenemos que lidiar con conjuntos de datos con valores faltantes. No hay ejemplos prácticos en esta sección, pero te enseñaré cómo reemplazar estos valores con regresión lineal.
Entonces, comencemos con la programación (ahora mismo)
Antes de hacer eso, es una buena idea instalar los paquetes de mi artículo anterior (Paquetes Python para minería de datos).
1) Predicción de los precios de la vivienda
Tenemos el siguiente conjunto de datos:
Ingrese el número
Pies cuadrados
Precio
1 150 6450
2 200 7450
3 250 8450
4 300 9450
5 350 11450
6 400 15450
7 600 18450
Pasos:
En la regresión lineal, todos sabemos que debe estar en los datos Encuentre una relación lineal para que podamos obtener θ0 y θ1. Nuestra ecuación hipotética se ve así:
Donde: hθ(x) es el valor del precio (el valor que queremos predecir) con respecto a un pie cuadrado específico (es decir, el precio es una función lineal de los pies cuadrados). ); θ0 es una constante; θ1 es el coeficiente de regresión.
Ahora comienza a programar:
Paso 1
Abre tu editor de texto favorito y asígnale el nombre predict_house_price.py. Usaremos el siguiente paquete en nuestro programa, así que copie el siguiente código en el archivo predict_house_price.py.
Python
1
2
3
4
5 p>
5
p>
# Paquetes requeridos
importar matplotlib.pyplot como plt
importar numpy como np
importar pandas como pd
desde conjuntos de datos de importación de sklearn, linear_model
Ejecute su código. Si su programa es correcto, entonces el paso 1 está básicamente completado. Si encuentra ciertos errores, significa que le faltan algunos paquetes, así que regrese y mire la página de paquetes. Instale todos los paquetes en la publicación del blog y ejecute su código nuevamente. Esperemos que esta vez no tengas ningún problema.
Ahora que su programa es correcto, continuemos...
Paso 2
Guardo los datos en un archivo .csv llamado input_data.csv Entonces, escriba una función para convertir los datos en valor X (pies cuadrados), valor Y (precio)
Python
1
2
3
4
5
6
7
8
9
# Función para obtener datos
def get_data(file_name):
data = pd.read_csv(file_name)
X_parameter = [ ]
Y_parameter = []
for single_square_feet ,single_price_value in zip(data['square_feet'],data['price']):
X_parameter. append([float(single_square_feet)])
Y_parameter.append(float(single_price_value))
return X_parameter,Y_parameter
Línea 3: los datos .csv son leer en un marco de datos de Pandas.
Líneas 6-9: convierte el marco de datos de Pandas en datos de parámetros X e parámetros Y y los devuelve.
Entonces, imprimamos el parámetro X y el parámetro Y:
Python
1
2
3
[[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]]
[6450.0, 7450.0, 8450.0, 9450.0 , 11450.0, 15450.0, 18450.0]
[Terminado en 0.7s]
Salida del script: ?[[150.0], [200.0], [250.0], [300.0], [350.0 ], [400.0], [600.0]] [6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0] [Terminado en 0.7s]
Paso 3
Ahora vamos a ajuste el parámetro X y el parámetro Y en un modelo de regresión lineal. Vamos a escribir una función que tome como entrada los parámetros X, el parámetro Y y el valor en pies cuadrados que desea predecir, y devuelva θ0, θ1 y el valor del precio previsto.
Python
1
2
3
4
5 p>
5
p>
6
7
8
9
10
11
12
# Función para ajustar nuestros datos al modelo lineal
def linear_model_main(X_parameters,Y_parameters,predict_value):
# Crear objeto de regresión lineal
regr = linear_model.LinearRegression()
regr.fit(X_parameters, Y_parameters)
predict_outcome = regr.predict(predict_value)
predicciones = {}
predicciones['intercept'] = regr.intercept_
predicciones['coeficiente'] = regr. coef_
predicciones['predicted_value' ] = predict_outcome
devolver predicciones
Línea 5-6: Primero, cree un modelo lineal y entrénelo con nuestros parámetros X y parámetro_Y.
Líneas 8-12: creamos un diccionario llamado predicciones, que almacena θ0, θ1 y los valores predichos, y devuelve el diccionario de predicciones como salida.
Así que llamemos a nuestra función y predizcamos el valor en pies cuadrados de 700.
Python
1
2
3
4
5 p>
5
p>
6
X,Y = get_data('input_data.csv')
predictvalue = 700 p>
resultado = linear_model_main(X,Y, valor predictivo)
imprimir "valor de intercepción", resultado['intercepción']
imprimir "coeficiente", resultado['coeficiente" ']
imprimir "Valor previsto: ",resultado['valor_predicho']
Salida del script: valor de intersección 1771.80851064 coeficiente [28.77659574] Valor previsto: [21915.42553191] [Terminado en 0,7 s ]
Aquí, el valor de intersección (el valor de intersección) es el valor de θ0 y el valor del coeficiente (coeficiente) es el valor de θ1. Obtenemos un valor de precio previsto de 21915,4255, lo que significa que hemos terminado de predecir el precio de la casa.
Para verificarlo, necesitamos ver cómo nuestros datos se ajustan a la regresión lineal. Entonces necesitamos escribir una función con entradas X_parameters y Y_parameters para mostrar la línea recta ajustada a los datos.
Python
1
2
3
4
5 p>
5
p>
6
7
8
9
10
# Función para mostrar los resultados del modelo de ajuste lineal
def show_linear_line(X_parameters,Y_parameters):
# Crear objeto de regresión lineal
regr = linear_model.LinearRegression()
regr.fit(X_parameters, Y_parameters)
plt.scatter(X_parameters,Y_parameters,color='blue')
plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)
plt.xticks(())
plt.yticks( ())
plt.show ()
Luego llame a la función show_linear_line:
Python
1
show_linear_line(X,Y)
Salida del guión:
2) Predice qué programa de televisión tendrá más espectadores la próxima semana
The Flash es un programa de televisión escrito de los guionistas y productores Greg Berlanti, Andrew Kreisberg y Geoff Johns, una serie de televisión estadounidense transmitida por The CW. Está basado en el personaje de DC Comics The Flash (Barry Allen), un superhéroe que lucha contra el crimen con un disfraz extraño y la capacidad de moverse a velocidades sobrehumanas. El personaje fue creado por Robert Kanigher, John Broome y Carmine Infantino. Es un spin-off de Arrow y existe en el mismo mundo. El piloto de la serie fue escrito por Berlanti, Kreisberg y Johns y dirigido por David Nutter. La serie se estrenó en Norteamérica el 7 de octubre de 2014, convirtiéndose en el programa de televisión más visto de CW.
Arrow es una serie de televisión creada por los guionistas/productores Greg Berlanti, Marc Guggenheim y Andrew Kreisberg. Está basado en el personaje de DC Comics Green Arrow, un luchador contra el crimen con un disfraz extraño creado por Mort Weisinger y George Papp. Se estrenó en Norteamérica el 10 de octubre de 2012 y comenzó a transmitirse en todo el mundo a finales de 2012. Filmada principalmente en Vancouver, Columbia Británica, Canadá, la serie cuenta la historia del playboy multimillonario Oliver Queen, interpretado por Stephen Amell. Después de estar atrapado en una isla enemiga durante cinco años, regresa a su ciudad natal para luchar contra el crimen y la corrupción y se convierte en un. arma. Un misterioso justiciero con arco y flecha. A diferencia de los cómics, Queen no utilizó inicialmente el seudónimo Green Arrow.
Con estos dos programas empatados por el título de mi programa de televisión favorito, siempre me he preguntado qué programa era más popular entre los demás y quién ganaría finalmente la batalla de ratings. Entonces, escribamos un programa para predecir qué programa de televisión tendrá más espectadores. Necesitamos un conjunto de datos que proporcione la audiencia de cada episodio. Afortunadamente, obtuve estos datos de Wikipedia y los organicé en un archivo .csv. Se muestra a continuación.
The Flash
La audiencia estadounidense de The Flash
Arrow
La audiencia estadounidense de The Arrow
1 4,83 1 2,84
2 4,27 2 2,32
3 3,59 3 2,55
4 3,53 4 2,49
5 3,46 5 2,73
6 3,73 6 2,6
7 3,47 7 2,64
8 4,34 8 3,92
9 4,66 9 3,06
Los espectadores son millones .
Pasos para resolver el problema:
Primero necesitamos convertir los datos en parámetros_X y parámetros_Y, pero aquí tenemos dos parámetros_X y parámetros_Y. Por lo tanto, asígneles el nombre flash_x_parameter, flash_y_parameter, arrow_x_parameter, arrow_y_parameter. Luego necesitamos ajustar los datos en dos modelos de regresión lineal diferentes: primero para The Flash y luego para Arrow. A continuación, debemos predecir la cantidad de espectadores del próximo episodio de dos programas de televisión. Luego podemos comparar los resultados y especular qué programa tendrá más espectadores.
Paso 1
Importar nuestro paquete:
Python
1
2
3
4
5
6
7
# Paquetes requeridos
importar csv
importar sys
importar matplotlib.pyplot como plt
importar numpy como np
importar pandas como pd
>de sklearn import datasets, linear_model
Paso 2
Escribe una función que tome nuestro conjunto de datos como entrada y devuelva los valores flash_x_parameter, flash_y_parameter, arrow_x_parameter, arrow_y_parameter.
Python
1
2
3
4
5 p>
5
p>
6
7
8
9
10
11
12
13
# Función para obtener datos
def get_data(file_name):
datos = pd.read_csv( nombre_archivo)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = [] p>
arrow_y_parameter = []
para x1,y1,x2,y2 en zip(datos['flash_episode_number'],datos['flash_us_viewers'],datos['arrow_episode_number'],datos[ 'arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append ([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter, flash_y_parameter, arrow_x_parameter, arrow_y_parameter
Ahora que tenemos nuestros parámetros, escribamos una función usando los parámetros anteriores Como entrada, dada una salida, predice qué programa tendrá más espectadores.
Python
1
2
3
4
5 p>
5
p>
6
7
8
9
10
11
12
13
14
15
# Función para saber qué programa de televisión tendrá más espectadores
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1 .fit(x1, y1)
valor_predicho1 = regr1.predict(9)
imprimir valor_predicho1
regr2 = modelo_lineal.RegresiónLineal()
regr2.fit(x2, y2)
valor_predicho2 = regr2.predict(9)
#imprimir valor_predicho1
#imprimir valor_predicho2
if valor_predicho1 > valor_predicho2:
imprimir "El programa de televisión Flash tendrá más espectadores la próxima semana"
else:
imprimir "El programa de televisión Arrow tendrá tener más espectadores para la próxima semana"
Escribe todo en un archivo. Abra su editor, asígnele el nombre predict.py y copie el siguiente código en predict.py.
Python
1
2
3
4
5 p>
5
p>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
p>31
32
33
34
35
36
37
38
39
40
41
# Paquetes requeridos
importar csv
importar sys
importar matplotlib.pyplot como plt
importar numpy como np
importar pandas como pd
desde sklearn importar conjuntos de datos, linear_model
# Función para obtener datos
def get_data(file_name) ):
datos = pd.read_csv( nombre_archivo)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
para x1,y1,x2,y2 en zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'], datos['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter .append([float(x2)])
arrow_y_parameter.append(float(y2))
devuelve flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
# Función para saber qué programa de televisión tendrá más espectadores
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1 .fit(x1, y1)
valor_predicho1 = regr1.predict(9)
imprimir valor_predicho1
regr2 = modelo_lineal.RegresiónLineal()
regr2.fit(x2, y2)
pred
icted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
imprimir "El Flash Tv Show tendrá más espectadores la próxima semana"
else:
print "Arrow Tv Show tendrá más espectadores la próxima semana"
x1,y1 ,x2,y2 = get_data('input_data.csv')
#print x1,y1,x2,y2
más_visores(x1,y1,x2,y2)
Tal vez puedas adivinar qué programa tendrá más espectadores, pero ejecuta el programa y comprueba si estás en lo cierto.
3) Reemplazar los valores faltantes en el conjunto de datos
A veces, nos encontraremos con situaciones en las que necesitamos analizar datos que contienen valores faltantes. Algunas personas descartarán estos valores faltantes y luego los analizarán; otras los reemplazarán con el valor máximo, el valor mínimo o el valor promedio. La media es la mejor de las tres, pero se puede utilizar la regresión lineal para reemplazar eficazmente esos valores faltantes.
El método funciona más o menos así.
Primero encontramos el valor que falta en la columna que queremos reemplazar y averiguamos de qué datos en otras columnas depende el valor que falta. Tome la columna con valores faltantes como parámetros_Y, tome las columnas de las cuales los valores faltantes dependen más como parámetros_X y ajuste estos datos en un modelo de regresión lineal. Ahora puede predecir la columna que falta utilizando aquellas columnas de las que los valores faltantes dependen más.
Una vez completado este proceso, tenemos datos sin valores faltantes para que podamos analizarlos libremente.
Para practicar, le dejaré este problema a usted, así que obtenga algunos datos de valores faltantes de Internet y resuelva este problema. Una vez que hayas terminado por favor deja tus comentarios. Me encantaría ver tus resultados.
Una pequeña nota personal:
Me gustaría compartir mi experiencia en minería de datos personales. Recuerdo que en mi curso de introducción a la minería de datos, el profesor comenzó lentamente y explicó algunas áreas donde se puede aplicar la minería de datos y algunos conceptos básicos. Entonces, de repente, la dificultad aumenta rápidamente. Esto hizo que algunos de mis compañeros de clase se sintieran muy frustrados e intimidados por el curso, lo que finalmente acabó con su interés en la minería de datos. Por eso quiero evitar hacer eso en las publicaciones de mi blog. Quería mantener las cosas más informales. Por eso trato de utilizar ejemplos interesantes para que los lectores puedan aprender más cómodamente en lugar de aburrirse o intimidarse.
Gracias por leer esto. Deje sus preguntas o sugerencias en el cuadro de comentarios y estaré encantado de responderle.