Proyecto de Machine Learning - MakeitReal / DataSource.ai - Parte 2
Definir diferentes subconjuntos de datos
Después de evaluar el primer modelo, puede ver que average_review_length y average_review_age por sí solas no son los mejores predictores para la clasificación de Yelp.
Vamos a hacer un poco más de modelado con diferentes subconjuntos de características y ver si podemos lograr un modelo más preciso!
En las celdas de abajo hemos proporcionado diferentes listas de subconjuntos de características con las que modelaremos y evaluaremos. ¿Qué otros subconjuntos de características le gustaría probar? ¿Por qué crees que esos conjuntos de características son más predictivos de la clasificación Yelp que otros? Cree al menos un subconjunto más de características a partir de las cuales desea predecir las clasificaciones de Yelp. Copie y pegue los subconjuntos en la siguiente celda
# subset of only average review sentiment sentiment = ['average_review_sentiment'] # subset of all features that have a response range [0,1] binary_features = ['alcohol?','has_bike_parking','takes_credit_cards','good_for_kids','take_reservations','has_wifi'] # subset of all features that vary on a greater range than [0,1] numeric_features = ['review_count','price_range','average_caption_length','number_pics','average_review_age','average_review_length','average_review_sentiment','number_funny_votes','number_cool_votes','number_useful_votes','average_tip_length','number_tips','average_number_friends','average_days_on_yelp','average_number_fans','average_review_count','average_number_years_elite','weekday_checkins','weekend_checkins'] # all features all_features = binary_features + numeric_features
Otros modelos
Ahora que tenemos listas de diferentes subconjuntos de características, podemos crear nuevos modelos a partir de ellos. Para poder comparar más fácilmente el rendimiento de estos nuevos modelos, hemos creado una función para usted llamada model_these_features().
Esta función replica el proceso de construcción del modelo que acaba de completar con nuestro primer modelo! Tómese un tiempo para revisar cómo funciona la función, analizándola línea por línea. Rellene los comentarios vacíos con una explicación de la tarea que el código debajo está realizando.
import numpy as np
# take a list of features to model as a parameter
def model_these_features(feature_list):
# define ratings and features, with the features limited to our chosen subset of data
ratings = df.loc[:,'stars']
features = df.loc[:,feature_list]
# perform train, test, split on the data
X_train, X_test, y_train, y_test = train_test_split(features, ratings, test_size = 0.2, random_state = 1)
# don't worry too much about these lines, just know that they allow the model to work when
# we model on just one feature instead of multiple features. Trust us on this one :)
if len(X_train.shape) < 2:
X_train = np.array(X_train).reshape(-1,1)
X_test = np.array(X_test).reshape(-1,1)
# create and fit the model to the training data
model = LinearRegression()
model.fit(X_train,y_train)
# print the train and test scores
print('Train Score:', model.score(X_train,y_train))
print('Test Score:', model.score(X_test,y_test))
# print the model features and their corresponding coefficients, from most predictive to least predictive
print(sorted(list(zip(feature_list,model.coef_)),key = lambda x: abs(x[1]),reverse=True))
# calculate the predicted Yelp ratings from the test data
y_predicted = model.predict(X_test)
# plot the actual Yelp Ratings vs the predicted Yelp ratings for the test data
plt.scatter(y_test,y_predicted)
plt.xlabel('Yelp Rating')
plt.ylabel('Predicted Yelp Rating')
plt.ylim(1,5)
plt.show()Copielo y peguelo en la siguiente celda
sentiment: sólo average_review_sentiment
binary_features: todas las características que tienen un rango de respuesta [0,1]
numeric_features: todas las características que varían en un rango mayor que [0,1]
all_features: todas las características
feature_subset: su propio subconjunto de características
¿Cómo afecta el cambio de los conjuntos de características al valor R^2 del modelo? ¿Qué características son más importantes para predecir la clasificación Yelp en los diferentes modelos?
Debut de Danielle's Delicious Delicacies
Ha cargado los datos, los ha limpiado, modelado y evaluado. Estás cansado, pero resplandeciente de orgullo después de todo el trabajo duro. Cierra los ojos y puedes ver claramente el día de apertura de Delicious Delicacies de Danielle con una fila de personas en la puerta. Pero, ¿cuál será su calificación de Yelp? Usemos nuestro modelo para hacer una predicción.
Nuestro mejor modelo era el que utilizaba todas las funciones!!, así que volveremos a trabajar con este modelo. En la celda de abajo imprima all_features para obtener un recordatorio de las características con las que estamos trabajando.
features = df.loc[:,all_features] ratings = df.loc[:,'stars'] X_train, X_test, y_train, y_test = train_test_split(features, ratings, test_size = 0.2, random_state = 1) model = LinearRegression() model.fit(X_train,y_train)
pd.DataFrame(list(zip(features.columns,features.describe().loc['mean'],features.describe().loc['min'],features.describe().loc['max'])),columns=['Feature','Mean','Min','Max'])
El primer espacio en blanco corresponde a la característica en index=0 en el DataFrame de arriba, alcohol? y el último espacio en blanco corresponde a la característica en index=24, weekend_checkins. Asegúrese de introducir 0 o 1 para todas las características binarias, y si no está seguro de qué valor poner para una característica, seleccione la media en el DataFrame de arriba.
Guarde el array de numpy en una variable llamada danielles_delicious_delicacies y recuerde hacerle un reshape(1, -1)
Después de ingresar los valores, ejecute la celda de predicción a continuación para recibir su calificación de Yelp! ¿Cómo va a ser el debut de Danielle Delicious Delicacies?
Próximos pasos
Usted ha construido con éxito un modelo de regresión lineal que predice la clasificación Yelp de un restaurante! Como has visto, puede ser bastante difícil predecir una calificación como ésta incluso cuando tenemos una plétora de datos.
¿Qué otras preguntas le vienen a la mente cuando ve los datos que tenemos? ¿Qué ideas cree usted que podrían pronosticar de un tipo diferente de análisis? Aquí hay algunas ideas para reflexionar:
- ¿Podemos predecir el tipo de cocina de un restaurante en función de los usuarios que la revisan?
- ¿Qué restaurantes son similares entre sí en otros aspectos además del tipo de cocina?
- ¿Existe un ambiente diferente en los restaurantes, y qué tipo de restaurantes se ajustan a estos conceptos?
- ¿Cómo afecta el estatus de las redes sociales a la credibilidad y visibilidad de un restaurante?
A medida que avance en el campo de la ciencia de datos, podrá crear modelos que aborden estas preguntas y muchas más. Pero mientras tanto, felicitece, ha alcanzado un gran logro!!
Recursos:
- Dataset: https://drive.google.com/file/d/1cFC0m0fWDaPgNjUU8dlGU99I8CovyT7p/view?usp=sharing
- Ejercicio en Jupyter Notebook: https://drive.google.com/file/d/1ShoIKXPkY8Y9RcAs_6Ggup33LY75cU6I/view?usp=sharing
- Puedes encontrar este texto y código en Github para visualizarlo como un jupyter notebook aqui
- Solucion: La solucion la encontrarás en un link al final de este post. Recuerda retarte primero a ti mismo(a)!
- Bootcamp Data Science MakeitReal: Información aqui