Skip to content

Instantly share code, notes, and snippets.

@DarquesM
Last active July 5, 2017 22:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DarquesM/841ccf25d1d2f864fb85e123b0fa1da6 to your computer and use it in GitHub Desktop.
Save DarquesM/841ccf25d1d2f864fb85e123b0fa1da6 to your computer and use it in GitHub Desktop.
Notebook for kaggle's competition "House prices"
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import pandas as pd\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"import myplots\n",
"import seaborn as sns\n",
"\n",
"from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV\n",
"from sklearn import preprocessing\n",
"from sklearn.linear_model import Lasso, ElasticNet\n",
"from sklearn.ensemble import GradientBoostingRegressor, IsolationForest, AdaBoostRegressor\n",
"from sklearn import metrics\n",
"from sklearn.metrics import r2_score\n",
"\n",
"import time"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# FONCTIONS \"MAISON\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Deux fonctions pour la création de variables dummies pour les catégorielles\n",
"#Entrer le fichier de données à traiter et les colonnes à transformer\n",
"def dummy(data, feature):\n",
" return pd.get_dummies(data[feature], prefix=str(feature+\"_\"))\n",
"\n",
"def dummies_create(dat,feat):\n",
" dat = pd.concat([dat,dummy(dat, feat)],axis=1)\n",
" return dat\n",
"\n",
"#Traite les valeurs nulles pour les catégorielles\n",
"def cat_null_values(dat,feat):\n",
" dat.loc[dat[feat].isnull(), feat] = \"None\"\n",
"\n",
"#Remplacement des valeurs numériques nulles par leur moyenne\n",
"def numeric_null_values(dat,feat):\n",
" dat.loc[dat[feat].isnull(),feat] = np.mean(dat[feat])\n",
"\n",
"#Calcul du crossval score pour un modèle\n",
"def cross_val(model,data,features):\n",
" scores = (cross_val_score(model,data[features],data[\"SalePrice\"],cv=10,n_jobs=1)).mean()\n",
" return scores\n",
"\n",
"#RMSE, log du prix : méthode de scoring utilisée par kaggle sur cette compétition\n",
"#true = prix réel, pred = prix prédit par le modèle\n",
"def RMSE_log(true,pred):\n",
" RMSE = metrics.mean_squared_error(np.log(true),np.log(pred))**0.5\n",
" return RMSE\n",
"\n",
"#Optimisation des hyperparamètres avec GridSearchCV\n",
"#data = données à utiliser, feat = features à considérer, target = SalePrice, params = dictionnaire de paramètres à tester\n",
"#model = type de modèle à appliquer (Lasso, Elastic Net, etc), X_valid = jeu de données Kaggle pour prédiction & soumission\n",
"def GridSearch(data,feat,target,params,model,X_valid):\n",
" X = data[feat]\n",
" y = data[target]\n",
" mod = model()\n",
" mod_CV = GridSearchCV(estimator=mod, param_grid=params,cv=10,n_jobs=2,scoring='r2')\n",
" mod_CV.fit(X,y)\n",
" print(\"Meilleurs paramètres :\",mod_CV.best_params_)\n",
" print(\"Le meilleur score R2 :\",mod_CV.best_score_)\n",
" pred = mod_CV.predict(X_valid)\n",
" return mod_CV, pred\n",
"\n",
"#data_valid=données de validation du modèle pour soumission Kaggle; pred = prix prédit par le modèle\n",
"def writePredFile(data_valid, pred, fileName):\n",
" answer = pd.DataFrame()\n",
" answer[\"Id\"] = (data_valid.Id).astype(int)\n",
" answer[\"SalePrice\"] = pred\n",
" answer.to_csv(fileName,index=False)\n",
" \n",
"#Construction d'un ensemble de regresseurs\n",
"def EnsembleRegressor(regressors,X_Validation):\n",
" EnsemblePred = pd.DataFrame()\n",
" for reg in regressors:\n",
" colname = str(reg)[:4]\n",
" EnsemblePred[colname] = reg.predict(X_Validation)\n",
" EnsemblePred[\"Ensemble\"] = EnsemblePred.apply(lambda x: np.mean(x), axis=1)\n",
" EnsemblePred[\"Ensemble\"] = EnsemblePred.apply(lambda x: np.median(x), axis=1)\n",
" return EnsemblePred"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# IMPORTATION DES DONNEES"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data = pd.read_csv(\"1-Original Data/train.csv\")\n",
"data_validation = pd.read_csv(\"1-Original Data/test.csv\")\n",
"data_Id = data_validation.Id\n",
"temp = pd.DataFrame(data[\"SalePrice\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exploration des valeurs nulles"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pd.get_dummies(data, sparse=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.isnull().sum().sort_values(ascending=False)[:20]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data_validation.isnull().sum().sort_values(ascending=False)[:34]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# CREATION DE VARIABLES"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Création d'une variable reflétant la date des derniers travaux"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data[\"AgeTravaux\"] = np.abs(data.YrSold-data.YearRemodAdd)\n",
"data_validation[\"AgeTravaux\"] = np.abs(data_validation.YrSold-data_validation.YearRemodAdd)\n",
"#Ne pas oublier d'enlever YearRemodAdd de la liste des features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TRANSFORMATION DES DONNEES"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Il faut transformer les variables numériques avant de créer les dummies\n",
"\n",
"Dans un premier temps je me contente d'appliquer un log à toutes les colonnes numériques."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data_target = data.SalePrice\n",
"#Liste des colonnes \"catégorielles\"\n",
"data_cat = data.select_dtypes(['object'])\n",
"#Transformation des colonnes numériques (log)\n",
"data_num = (data.select_dtypes(exclude=[object])).drop(['SalePrice','Id'],axis=1).transform(lambda x: np.log1p(x))\n",
"#Assemblage des données pour reconstituer le tableau complet\n",
"data = pd.concat((data_target,data_cat,data_num),axis=1,join='inner')\n",
"\n",
"#Un peu fainéant, juste un copier coller\n",
"data_cat = data_validation.select_dtypes(['object'])\n",
"data_num = (data_validation.select_dtypes(exclude=[object])).drop(['Id'],axis=1).transform(lambda x: np.log1p(x))\n",
"data_validation = pd.concat((data_Id,data_cat,data_num),axis=1,join='inner')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"** Faire un test pour voir si pandas crée les dummies uniquement sur les catégorielles ** (pas besoin de sélectionner)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On n'a évidemment pas les mêmes valeurs nulles d'un jeu de données à un autre. Il faut automatiser le traitement."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#On récupère séparemment les noms des colonnes \"cat\" et \"numériques\"\n",
"colnames_cat = (data.select_dtypes(['object'])).columns\n",
"colnames_num = (data.select_dtypes(exclude=[object])).columns\n",
"\n",
"#Les valeurs NaN numériques sont transformées en \"None\"\n",
"for c_ in colnames_num:\n",
" numeric_null_values(data,c_)\n",
"\n",
"#Création de dummies pour les variables catégorielles\n",
"for c_ in colnames_cat:\n",
" cat_null_values(data,c_)\n",
" data = dummies_create(data,c_) #Create dummies for all cat features (c_)\n",
"\n",
"#Même chose pour les données de validation\n",
"#On récupère séparemment les noms des colonnes \"cat\" et \"numériques\"\n",
"colnames_cat = (data_validation.select_dtypes(['object'])).columns\n",
"colnames_num = (data_validation.select_dtypes(exclude=[object])).columns\n",
"\n",
"#Les valeurs NaN numériques sont transformées en \"None\"\n",
"\n",
"for c_ in colnames_num:\n",
" numeric_null_values(data_validation,c_)\n",
"\n",
"\n",
"#Les valeurs NaN numériques sont transformées en \"None\"\n",
"for c_ in colnames_cat:\n",
" cat_null_values(data_validation,c_)\n",
" data_validation = dummies_create(data_validation,c_) #Create dummies for all cat features (c_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les données de train ont plus de colonnes que celles de validation, il faudra les trouver et les supprimer"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.shape, data_validation.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# DETECTION ET SUPPRESSION D'OUTLIERS"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nombre d'outliers : 73.0\n"
]
}
],
"source": [
"#Le paramètre 'contamination' permet de contrôler la taille du cluster\n",
"clf = IsolationForest(contamination=0.05)\n",
"#clf.fit(data.select_dtypes(exclude=['object']))\n",
"#pred_outlier = clf.predict(data.select_dtypes(exclude=['object']))\n",
"X = pd.DataFrame()\n",
"X[\"LotArea\"] = data.LotArea\n",
"X[\"SalePrice\"] = data.SalePrice\n",
"clf.fit(X)\n",
"pred_outlier = clf.predict(X)\n",
"print(\"Nombre d'outliers : \",(len(pred_outlier)-pred_outlier.sum())/2)\n",
"data[\"Outlier\"] = pred_outlier"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On peut observer quelles propriétés ont été supprimées par variable. Par exemple, pour \"LotArea\""
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x1f0a224d2e8>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAoFAKCb8HzGkSOlOTQufAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1f0a24e25c0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(data.LotArea, data.SalePrice, c=data.Outlier)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On supprime les outliers du jeu de données"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data = data.query('Outlier==1')\n",
"data = data.drop('Outlier', axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ecriture des données transformées pour manipulations ultérieures sans pré-traitement"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data.to_csv(\"2-Prepared Data/train.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les données sont prêtes, on peut passer à l'analyse"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# FEATURES / TARGET"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Je vérifie rapidement que mes données sont toujours OK"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Colonnes présentes dans chaque data set\n",
"col1 = set(data.columns)\n",
"col2 = set(data_validation.columns)\n",
"#Il manque des features dans le validation set, on récupère les features manquantes et on les enlèvera de la liste des features\n",
"#On les met à zéro puisque qu'ils ne sont pas là\n",
"#Certains catégories n'étant pas présentes, il n'a pas crée exactement les mêmes colonnes\n",
"missing_feat = (col1 - col2)\n",
"missing_feat.remove(\"SalePrice\")\n",
"for feat in missing_feat:\n",
" #data_validation = data_validation.drop(feat,axis=1)\n",
" data = data.drop(feat,axis=1)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant que les \"dummies\" sont créees il faut supprimer 1 colonne pour chaque variable catégorielle pour éviter les doublons qui risquent de fausser le modèle"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"8\n"
]
}
],
"source": [
"col1 = set(data.columns)\n",
"col2 = set(data_validation.columns)\n",
"len(col1 & col2) #328\n",
"len(col1 | col2) #356\n",
"print(len(col1-col2)) #20\n",
"print(len(col2-col1)) #0"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"#Opération inverse pour ne pas considérer les colonnes absentes dans le data set\n",
"missing_feat = (col2 - col1)\n",
"#missing_feat.remove(\"Id\") #Attention de ne pas supprimer l'Id\n",
"for feat in missing_feat:\n",
" data_validation = data_validation.drop(feat,axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"features = list(data.columns) #Tous les noms de colonnes (on peut prendre data ou data_validation maintenant qu'on les a équilibrés)\n",
"features_drop = list(colnames_cat) #Toutes les colonnes catégorielles\n",
"for feat in features_drop: #On enlève les catégorielles de la liste des features\n",
" features.remove(feat)\n",
"\n",
"features.remove(\"SalePrice\")\n",
"features.remove(\"YearRemodAdd\")\n",
"#features.remove(\"AgeTravaux\")\n",
"#features.remove(\"Id\")\n",
"target = \"SalePrice\""
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#On peut vérifier si une feature a bien été enlevée\n",
"\"BsmtQual\" in features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# HUBER REGRESSION"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Régression robuste, moins sensible aux outliers"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"train,test = train_test_split(data,test_size=0.2)\n",
"X_train = train[features]\n",
"y_train = train[target]\n",
"X_test = test[features]\n",
"y_test = test[target]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE pour le test set : 0.133046115539\n"
]
}
],
"source": [
"from sklearn.linear_model import HuberRegressor\n",
"Huber_model = HuberRegressor(alpha=0.00002)\n",
"Huber_model.fit(X_train,y_train)\n",
"Huber_pred_test = Huber_model.predict(X_test)\n",
"print(\"RMSE pour le test set : \",RMSE_log(y_test,Huber_pred_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Attention, si on a fait un scaling, les paramètres sont très différents"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1f0a9d1c748>"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1f0a9cda828>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"alpha = np.arange(0.00001,0.0001,0.00001)\n",
"train_scores = np.array([])\n",
"test_scores = np.array([])\n",
"for a in alpha:\n",
" Huber_model = HuberRegressor(alpha=a)\n",
" Huber_model.fit(X_train,y_train)\n",
" train_scores = np.append(train_scores,Huber_model.score(X_train,y_train))\n",
" test_scores = np.append(test_scores,(cross_val_score(Huber_model,data[features],data[target],cv=10).mean())) #Donne le score sur le test après avoir procédé à un fit \n",
" \n",
"plt.plot(alpha, train_scores,'o', alpha, test_scores,'*')\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"R²\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ELASTIC NET"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Combinaison de Ridge et Lasso"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train,test = train_test_split(data,test_size=0.2)\n",
"X_train = train[features]\n",
"y_train = train[target]\n",
"X_test = test[features]\n",
"y_test = test[target]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE pour le test set : 0.147866221252\n",
"R2 pour le test set : 0.902949518913\n",
"Elastic Net a sélectionné 125 variables et en a éliminé 159\n"
]
}
],
"source": [
"from sklearn.linear_model import ElasticNetCV\n",
"ElNet_model = ElasticNetCV(l1_ratio=[.05,.1,.2, .5, .7, .9, .95,1],cv=10)\n",
"ElNet_model.fit(X_train,y_train)\n",
"ElNet_pred_test = ElNet_model.predict(X_test)\n",
"print(\"RMSE pour le test set : \",RMSE_log(y_test,ElNet_pred_test))\n",
"print(\"R2 pour le test set : \",r2_score(y_test,ElNet_pred_test))\n",
"\n",
"coef_EN = pd.Series(ElNet_model.coef_, index = X_train.columns)\n",
"\n",
"print(\"Elastic Net a sélectionné {0} variables et en a éliminé {1}\".format(sum(coef_EN!=0),sum(coef_EN==0)))\n",
"#cross_val(ElNet_model,data,features)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Le modèle ne prédit pas de valeurs inférieures à zéro.\n",
"(ElNet_pred_test < 0).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Observation de l'effet de l'augmentaion de l1 sur le R², plus on s'approche du lasso (l1 = 1), mieux c'est"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1f0a9b4acf8>"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAACG+3+Nt99IdYzIKQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1f0a9aa6e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#alpha = np.arange(0.02,0.2,0.01)\n",
"l1 = np.arange(0.05,1,0.05)\n",
"train_scores = np.array([])\n",
"test_scores = np.array([])\n",
"#for a in alpha:\n",
"for l in l1:\n",
" ElNet_model = ElasticNet(alpha=1, max_iter=1000, l1_ratio=l)\n",
" ElNet_model.fit(X_train,y_train)\n",
" train_scores = np.append(train_scores,ElNet_model.score(X_train,y_train))\n",
" test_scores = np.append(test_scores,(cross_val_score(ElNet_model,data[features],data[target],cv=10).mean())) #Donne le score sur le test après avoir procédé à un fit \n",
" \n",
"#plt.plot(alpha, train_scores,'o', alpha, test_scores,'*')\n",
"#plt.xlabel(\"Alpha\")\n",
"plt.plot(l1, train_scores,'o', l1, test_scores,'*')\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"R²\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Observation des coeficients "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for i in range(len(features)):\n",
" print(\"{0} \\t Coef : {1}\".format(features[i],ElNet_model.coef_[i]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"coef = pd.Series(ElNet_model.coef_, index = X_train.columns)\n",
"imp_coef = pd.concat([coef.sort_values().head(15),\n",
" coef.sort_values().tail(15)])\n",
"\n",
"plt.rcParams['figure.figsize'] = (8.0, 10.0)\n",
"imp_coef.plot(kind = \"barh\")\n",
"plt.title(\"Coefficients in the Elastic Net Model\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optimisation des hyperparamètres pour Elastic Net"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"param_grid = { \n",
" 'alpha': np.arange(0.00005,0.001,0.00005),\n",
" 'l1_ratio' : np.arange(0.1,1,0.1)\n",
"}\n",
"ElNetCV, pred = GridSearch(data, features,target, param_grid, ElasticNet, data_validation[features])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ecriture du fichier"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"writePredFile(data_validation, pred,\"Answer-ElasticNet.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GRADIENT BOOSTING \"SIMPLE\""
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train,test = train_test_split(data,test_size=0.2)\n",
"\n",
"X_train = train[features]\n",
"y_train = train[target]\n",
"X_test = test[features]\n",
"y_test = test[target]"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE pour le test set : 0.122771502893\n",
"R2 pour le test set : 0.899020921502\n"
]
}
],
"source": [
"GBoost_model = GradientBoostingRegressor(loss=\"ls\",\n",
" learning_rate=0.089,\n",
" n_estimators=1000,\n",
" max_depth=3,\n",
" alpha=0.14)\n",
"GBoost_model.fit(X_train,y_train)\n",
"GBoost_pred_test = GBoost_model.predict(X_test)\n",
"print(\"RMSE pour le test set : \",RMSE_log(y_test,GBoost_pred_test))\n",
"print(\"R2 pour le test set : \",r2_score(y_test,GBoost_pred_test))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(GBoost_pred_test<1).sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Prédiction**"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"GBoost_pred = GBoost_model.predict(data_validation[features])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optimisation des hyperparamètres pour Gradient Boosting"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'alpha': 0.14000000000000001, 'learning_rate': 0.089999999999999983, 'loss': 'ls'}\n",
"Temps d'exécution de la routine: 42.676209449768066\n",
"Le meilleur score R2 : 0.90050573188\n"
]
}
],
"source": [
"t_init = time.time()\n",
"X = data[features]\n",
"y=data[target]\n",
"GB_modelCV = GradientBoostingRegressor()\n",
"#Scoring peut être 'r2' ou 'neg_mean_squared_error'\n",
"param_grid = { \n",
" 'loss' : [\"ls\"],\n",
" 'learning_rate': np.arange(0.01,0.11,0.02),\n",
" 'alpha':np.arange(0.14,0.46,0.2)\n",
"}\n",
"CV_GB = GridSearchCV(estimator=GB_modelCV, param_grid=param_grid, cv= 10,n_jobs=2, scoring='r2')\n",
"CV_GB.fit(X, y)\n",
"print(CV_GB.best_params_)\n",
"t_final = time.time()\n",
"print(\"Temps d'exécution de la routine: \", t_final-t_init)\n",
"print(\"Le meilleur score R2 : \",CV_GB.best_score_)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ecriture du fichier"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"writePredFile(data_validation, GBoost_pred,\"Answer-GBoost.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ADA BOOST"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Loss peut être 'linear’, ‘square’, ‘exponential’"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train,test = train_test_split(data,test_size=0.2)\n",
"\n",
"X_train = train[features]\n",
"y_train = train[target]\n",
"X_test = test[features]\n",
"y_test = test[target]"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RMSE pour le test set : 0.171368827041\n",
"R2 pour le test set : 0.862673658786\n"
]
}
],
"source": [
"AdaBoost_model = AdaBoostRegressor(n_estimators=200, learning_rate=0.9, loss=\"exponential\")\n",
"AdaBoost_model.fit(X_train,y_train)\n",
"AdaBoost_pred_test = AdaBoost_model.predict(X_test)\n",
"print(\"RMSE pour le test set : \",RMSE_log(y_test,AdaBoost_pred_test))\n",
"print(\"R2 pour le test set : \",r2_score(y_test,AdaBoost_pred_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ENSEMBLE REGRESSOR"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"J'ai crée une fonction qui prend une liste de modèles en entrée et fait une prédiction qui est la moyenne des prédictions individuelles"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.099103361457851466"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Prédiction sur test set\n",
"predTestSet = EnsembleRegressor([ElNet_model, Huber_model, AdaBoost_model, GBoost_model], X_test)\n",
"\n",
"#predTestSet\n",
"RMSE_log(pred=predTestSet.Ensemble,true=y_test)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"#Prédiction finale\n",
"Final_answer = EnsembleRegressor([ElNet_model, Huber_model, AdaBoost_model,GBoost_model],data_validation[features])"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data_validation[\"Id\"] = data_Id"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"writePredFile(data_validation,Final_answer[\"Ensemble\"],\"Pred-Ensemble-ElHubAdaCVGB.csv\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sns.distplot(Final_answer.Ensemble)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# LASSO"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Modèle de LASSO que je n'utilise pas (uniquement elastic net)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train,test = train_test_split(data,test_size=0.2)\n",
"X_train = train[features]\n",
"y_train = train[target]\n",
"X_test = test[features]\n",
"y_test = test[target]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Score modèle LASSO sur train set 0.919208200969\n",
"Score modèle LASSO sur test set 0.895847439527\n",
"LASSO a sélectionné 120 variables et en a éliminé 164\n",
"Précision: 0.895 (+/- 0.031)\n",
"RMSE pour le test set : 0.135067031796\n"
]
}
],
"source": [
"lasso_model = Lasso(alpha=90, max_iter=1000)\n",
"lasso_model.fit(X_train,y_train)\n",
"print(\"Score modèle LASSO sur train set\",lasso_model.score(X_train,y_train))\n",
"print(\"Score modèle LASSO sur test set\",lasso_model.score(X_test,y_test))\n",
"coef = pd.Series(lasso_model.coef_, index = X_train.columns)\n",
"print(\"LASSO a sélectionné {0} variables et en a éliminé {1}\".format(sum(coef!=0),sum(coef==0)))\n",
"\n",
"scores_test = cross_val_score(lasso_model,data[features],data[target],cv=10) #Donne le score sur le test après avoir procédé à un fit\n",
"print(\"Précision: %0.3f (+/- %0.3f)\" % (scores_test.mean(), scores_test.std() * 2))\n",
"lasso_pred_test = lasso_model.predict(X_test)\n",
"print(\"RMSE pour le test set : \",RMSE_log(y_test,lasso_pred_test))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plus alpha sera élevé et plus le LASSO va simplifier le modèle en supprimant des variables. On peut chercher la valeur optimale en comparant les erreurs de training/test :"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1f0a9a0c438>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nLGUAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1f0a9b5f4e0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#alpha = np.arange(0.0001,0.0005,0.00001)\n",
"alpha = np.arange(10,500,20)\n",
"train_scores = np.array([])\n",
"test_scores = np.array([])\n",
"for a in alpha:\n",
" lasso_model = Lasso(alpha=a, max_iter=1000)\n",
" lasso_model.fit(X_train,y_train)\n",
" train_scores = np.append(train_scores,lasso_model.score(X_train,y_train))\n",
" test_scores = np.append(test_scores,(cross_val_score(lasso_model,data[features],data[target],cv=10).mean())) #Donne le score sur le test après avoir procédé à un fit \n",
"\n",
"plt.plot(alpha, train_scores,'o', alpha, test_scores,'*')\n",
"plt.xlabel(\"Alpha\")\n",
"plt.ylabel(\"R²\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La valeur optimale d'alpha est entre 100 et 200"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Quelques métriques"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"(lasso_pred_test<1).sum()\n",
"sns.distplot(lasso_pred_test)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1f0a9ad1908>"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1f0a9b3ce10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"coef = pd.Series(lasso_model.coef_, index = X_train.columns)\n",
"imp_coef = pd.concat([coef.sort_values().head(15),\n",
" coef.sort_values().tail(15)])\n",
"\n",
"\n",
"plt.rcParams['figure.figsize'] = (8.0, 10.0)\n",
"imp_coef.plot(kind = \"barh\")\n",
"plt.title(\"Coefficients in the Lasso Model\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optimisation des hyperparamètres pour le LASSO"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plutôt que la boucle écrite manuellement ci-dessus, on peut utiliser la fonction GridSearchCV de Scikit-Learn"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"param_grid = { \n",
" 'alpha': np.arange(20,200,10),\n",
" 'max_iter':np.arange(400,500,100)\n",
"}\n",
"Lasso_CV,pred_LassoCV = GridSearch(data, features,target, param_grid, Lasso, data_validation[features])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ecriture du fichier pour soumission à Kaggle"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le LASSO sans optimisation donne malgré tout un score honnête"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"writePredFile(data_validation, pred_LassoCV,\"Answer-Lasso.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**L'optimisation des hyperparamètres permet de scorer 0.13773, sans toucher aux numériques (skew)**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GRADIENT BOOSTING APRES PRE-SELECTION PAR LASSO"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ici, l'idée est de sélectionner les features avec un LASSO. \n",
"\n",
"Je supprime les features dont le coef est 0 via LASSO et je fais un gradient boosting uniquement avec quelques features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Liste des features conservées par le LASSO"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"scrolled": false
},
"outputs": [],
"source": [
"#Je garde tous les coefs = 0\n",
"zero_coef=[]\n",
"for i in range(len(features)):\n",
" #print(\"{0} \\t Coef : {1}\".format(features[i],lasso_model.coef_[i]))\n",
" if lasso_model.coef_[i] == 0:\n",
" zero_coef.append(features[i])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### On utilise uniquement les features sélectionnées par le LASSO"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#On supprime de la liste des features, toutes celles qui ont été éliminées par le lasso\n",
"for feat in zero_coef:\n",
" features.remove(feat)\n",
" \n",
"len(features)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"train,test = train_test_split(data,test_size=0.2)\n",
"\n",
"X_train = train[features]\n",
"y_train = train[target]\n",
"X_test = test[features]\n",
"y_test = test[target]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Hyperparamètres déjà sélectionnés via GridSearchCV\n",
"GBoost_model2 = GradientBoostingRegressor(loss=\"ls\",\n",
" learning_rate=0.07,\n",
" n_estimators=600,\n",
" max_depth=3,\n",
" alpha=0.1)\n",
"GBoost_model2.fit(X_train,y_train)\n",
"GBoost2_pred_test = GBoost_model2.predict(X_test)\n",
"print(\"RMSE pour le test set : \",RMSE_log(y_test,GBoost2_pred_test))\n",
"print(\"R2 pour le test set : \",r2_score(y_test,GBoost2_pred_test))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pred = GBoost_model2.predict(data_validation[features])\n",
"#writePredFile(data_validation, pred,\"Answer_GBL-lasso3.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Optimisation des paramètres du Gradient Boosting avec Lasso"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"t_init = time.time()\n",
"X = data[features]\n",
"y=data[target]\n",
"GBL_modelCV = GradientBoostingRegressor()\n",
"#Scoring peut être 'r2' ou 'neg_mean_squared_error'\n",
"param_grid = { \n",
" 'alpha': np.arange(0.1,0.5,0.1),\n",
" 'learning_rate' : np.arange(0.05,0.15,0.05),\n",
" 'n_estimators' : np.arange(400,600,200),\n",
" 'loss': ['ls']\n",
"}\n",
"CV_GBL = GridSearchCV(estimator=GBL_modelCV, param_grid=param_grid, cv= 10,n_jobs=1, scoring='r2')\n",
"CV_GBL.fit(X, y)\n",
"print(CV_GBL.best_params_)\n",
"t_final = time.time()\n",
"print(\"Temps d'exécution de la routine: \", t_final-t_init)\n",
"print(\"Le meilleur score R2 : \",CV_GBL.best_score_)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"pred = CV_GBL.predict(data_validation[features])\n",
"#writePredFile(data_validation, pred,\"Answer_GBL-lasso-CV.csv\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# QUELQUES ESSAIS CI-DESSOUS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Scaling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Utilisation de différents scalers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = data.drop(\"SalePrice\",1)\n",
"cols = data.select_dtypes(exclude=[object]).columns\n",
"temp = pd.Series(data[\"SalePrice\"]) #Je met SalePrice de côté dans un DataFrame temporaire\n",
"scaler = preprocessing.MinMaxScaler()\n",
"#scaler = preprocessing.StandardScaler() \n",
"data = pd.DataFrame(scaler.fit_transform(data.select_dtypes(exclude=[object])), columns=cols)\n",
"\n",
"data[\"SalePrice\"] = temp"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"cols = data_validation.select_dtypes(exclude=[object]).columns\n",
"#data_Id = data_validation.Id\n",
"data_validation = pd.DataFrame(scaler.fit_transform(data_validation.select_dtypes(exclude=[object])), columns=cols)\n",
"data_validation[\"Id\"] = data_Id\n",
"del temp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### DETECTION D'OUTLIERS"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Si l'on regarde par exemple la surface du bien, peut voir qu'un certain nombre de valeurs sortent du lot"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"plt.scatter(data.LotArea, data.SalePrice)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Essai de détection d'outliers uniquement sur SalePrice et LotArea puis sur toutes les features"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X = pd.DataFrame()\n",
"X[\"LotArea\"] = data.LotArea\n",
"X[\"SalePrice\"] = data.SalePrice\n",
"X = data.select_dtypes(exclude=['object'])\n",
"#Le paramètre 'contamination' permet de contrôler la taille du cluster\n",
"clf = IsolationForest(contamination=0.02)\n",
"#clf.fit(X_train) #Marche\n",
"clf.fit(X)\n",
"pred_outlier = clf.predict(X)\n",
"print(\"Nombre d'outliers : \",(len(pred_outlier)-pred_outlier.sum())/2)\n",
"data[\"Outlier\"] = pred_outlier\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Je peux rajouter une colonne à mes données pour repérer les outliers"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data[\"Outlier\"] = pred_outlier\n",
"X[\"Outlier\"] = pred_outlier"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Construction d'un meshgrid pour la représentation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"xx,yy = np.meshgrid(np.linspace(6,13,500),np.linspace(0,800000,500))\n",
"#Z est la fonction de décision permettant de délimiter les outliers\n",
"Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])\n",
"Z = Z.reshape(xx.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"plt.contour(xx,yy,Z, colors='red')\n",
"plt.contourf(xx,yy,Z, levels=[-0.18,Z.max()], colors='orange')\n",
"plt.scatter(data.LotArea, data.SalePrice, c=X.Outlier)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les outliers sont représentés en blanc"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data.loc[data.Outlier==-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Si la valeur de pred_outlier est -1 alors c'est un outlier"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X[\"Outlier\"] = pred_outlier\n",
"X.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"plt.scatter(data.LotArea, data.SalePrice, c=X.Outlier)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data.Outlier.value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"J'élimine les outliers de mes données"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data = data.query('Outlier==1')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"len(data)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data.loc[data.Outlier==-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sélection de toutes les colonnes numériques à l'exclusion de 'YrSold' et 'Id'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"(data.select_dtypes(exclude=[object])).drop(['YrSold','Id'],axis=1).describe()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.distplot(Final_answer.Hube)\n",
"sns.distplot(Final_answer.AdaB)\n",
"sns.distplot(Final_answer.Elas)\n",
"sns.distplot(Final_answer.Grid)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Je vérifie qu'aucune prédiction n'est négative**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(Final_answer.Grid<0).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(Final_answer.AdaB<0).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(Final_answer.Hube<0).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(Final_answer.Elas<0).sum()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"Final_answer.head(5)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment