\n",
+ "In this notebook, we learn how to use scikit-learn to implement Multiple linear regression. We download a dataset that is related to fuel consumption and Carbon dioxide emission of cars. Then, we split our data into training and test sets, create a model using training set, Evaluate your model using test set, and finally use model to predict unknown value\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
"
+ ],
+ "text/plain": [
+ " ENGINESIZE CYLINDERS FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY \\\n",
+ "0 2.0 4 9.9 6.7 \n",
+ "1 2.4 4 11.2 7.7 \n",
+ "2 1.5 4 6.0 5.8 \n",
+ "3 3.5 6 12.7 9.1 \n",
+ "4 3.5 6 12.1 8.7 \n",
+ "5 3.5 6 11.9 7.7 \n",
+ "6 3.5 6 11.8 8.1 \n",
+ "7 3.7 6 12.8 9.0 \n",
+ "8 3.7 6 13.4 9.5 \n",
+ "\n",
+ " FUELCONSUMPTION_COMB CO2EMISSIONS \n",
+ "0 8.5 196 \n",
+ "1 9.6 221 \n",
+ "2 5.9 136 \n",
+ "3 11.1 255 \n",
+ "4 10.6 244 \n",
+ "5 10.0 230 \n",
+ "6 10.1 232 \n",
+ "7 11.1 255 \n",
+ "8 11.6 267 "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_CITY','FUELCONSUMPTION_HWY','FUELCONSUMPTION_COMB','CO2EMISSIONS']]\n",
+ "cdf.head(9)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Lets plot Emission values with respect to Engine size:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue')\n",
+ "plt.xlabel(\"Engine size\")\n",
+ "plt.ylabel(\"Emission\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "#### Creating train and test dataset\n",
+ "Train/Test Split involves splitting the dataset into training and testing sets respectively, which are mutually exclusive. After which, you train with the training set and test with the testing set. \n",
+ "This will provide a more accurate evaluation on out-of-sample accuracy because the testing dataset is not part of the dataset that have been used to train the data. It is more realistic for real world problems.\n",
+ "\n",
+ "This means that we know the outcome of each data point in this dataset, making it great to test with! And since this data has not been used to train the model, the model has no knowledge of the outcome of these data points. So, in essence, it’s truly an out-of-sample testing.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "msk = np.random.rand(len(df)) < 0.8\n",
+ "train = cdf[msk]\n",
+ "test = cdf[~msk]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "#### Train data distribution"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue')\n",
+ "plt.xlabel(\"Engine size\")\n",
+ "plt.ylabel(\"Emission\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "source": [
+ "
Multiple Regression Model
\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In reality, there are multiple variables that predict the Co2emission. When more than one independent variable is present, the process is called multiple linear regression. For example, predicting co2emission using FUELCONSUMPTION_COMB, EngineSize and Cylinders of cars. The good thing here is that Multiple linear regression is the extension of simple linear regression model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Coefficients: [[11.61568854 6.8962874 9.77564503]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn import linear_model\n",
+ "regr = linear_model.LinearRegression()\n",
+ "x = np.asanyarray(train[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB']])\n",
+ "y = np.asanyarray(train[['CO2EMISSIONS']])\n",
+ "regr.fit (x, y)\n",
+ "# The coefficients\n",
+ "print ('Coefficients: ', regr.coef_)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As mentioned before, __Coefficient__ and __Intercept__ , are the parameters of the fit line. \n",
+ "Given that it is a multiple linear regression, with 3 parameters, and knowing that the parameters are the intercept and coefficients of hyperplane, sklearn can estimate them from our data. Scikit-learn uses plain Ordinary Least Squares method to solve this problem.\n",
+ "\n",
+ "#### Ordinary Least Squares (OLS)\n",
+ "OLS is a method for estimating the unknown parameters in a linear regression model. OLS chooses the parameters of a linear function of a set of explanatory variables by minimizing the sum of the squares of the differences between the target dependent variable and those predicted by the linear function. In other words, it tries to minimizes the sum of squared errors (SSE) or mean squared error (MSE) between the target variable (y) and our predicted output ($\\hat{y}$) over all samples in the dataset.\n",
+ "\n",
+ "OLS can find the best parameters using of the following methods:\n",
+ " - Solving the model parameters analytically using closed-form equations\n",
+ " - Using an optimization algorithm (Gradient Descent, Stochastic Gradient Descent, Newton’s Method, etc.)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
Prediction
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "button": false,
+ "new_sheet": false,
+ "run_control": {
+ "read_only": false
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Residual sum of squares: 628.86\n",
+ "Variance score: 0.82\n"
+ ]
+ }
+ ],
+ "source": [
+ "y_hat= regr.predict(test[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB']])\n",
+ "x = np.asanyarray(test[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB']])\n",
+ "y = np.asanyarray(test[['CO2EMISSIONS']])\n",
+ "print(\"Residual sum of squares: %.2f\"\n",
+ " % np.mean((y_hat - y) ** 2))\n",
+ "\n",
+ "# Explained variance score: 1 is perfect prediction\n",
+ "print('Variance score: %.2f' % regr.score(x, y))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "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.7.4"
+ },
+ "widgets": {
+ "state": {},
+ "version": "1.1.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/Artificial Intelligence/RegresssionModel.py b/Artificial Intelligence/RegresssionModel.py
new file mode 100644
index 0000000..aaabcb8
--- /dev/null
+++ b/Artificial Intelligence/RegresssionModel.py
@@ -0,0 +1,280 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Sun Jan 12 12:05:47 2020
+
+@author: Samyak
+"""
+
+#==============================================================================
+# REGRESSION MODEL - PREDICTING PRICE OF PRE OWNED CARS
+#==============================================================================
+import numpy as np
+import pandas as pd
+import seaborn as sns
+
+#setting graph size
+sns.set(rc = {"figure.figsize": (10, 8)})
+
+# Reading Data and getting info about data
+data_price = pd.read_csv("cars_sampled.csv")
+cars = data_price.copy()
+cars.info()
+
+cars.describe()
+
+# To set float values upto 3 decimal places
+pd.set_option("display.float_format", lambda x: "%.3f" % x)
+cars.describe()
+
+# Dropping unwanted columns
+cols = ["name", "dateCrawled", "dateCreated", "postalCode", "lastSeen"]
+cars = cars.drop(columns = cols, axis =1)
+
+#Removing duplicates from the data
+cars.drop_duplicates(keep="first", inplace=True)
+
+cars.isnull().sum()
+
+# varialbe Yearof Registration
+yearwise = cars["yearOfRegistration"].value_counts().sort_index()
+cars["yearOfRegistration"].describe()
+sum(cars["yearOfRegistration"] > 2018)
+sum(cars["yearOfRegistration"] < 1950)
+sns.regplot(x="yearOfRegistration", y="price", scatter=True, fit_reg=False, data=cars)
+
+# Removing Null values
+cars = cars.dropna(axis = 0)
+cars.isnull().sum()
+
+# varialbe price
+price_count = cars["price"].value_counts().sort_index()
+cars["price"].describe()
+sum(cars["price"] > 150000)
+sum(cars["price"] < 100)
+sns.distplot(cars["price"])
+
+# varialbe PowerPS
+power_count = cars["powerPS"].value_counts().sort_index()
+cars["powerPS"].describe()
+sum(cars["powerPS"] > 500)
+sum(cars["powerPS"] < 10)
+sns.boxplot(cars["powerPS"])
+sns.regplot(x="powerPS", y="price", scatter=True, fit_reg=False, data=cars)
+
+#Ranging the data to make it more usefull
+cars = cars[
+ (cars.yearOfRegistration >= 1950)
+ & (cars.yearOfRegistration <= 2018)
+ & (cars.price <= 150000)
+ & (cars.price >= 100)
+ & (cars.powerPS <= 500)
+ & (cars.powerPS >= 10)
+]
+
+cars["monthOfRegistration"] /= 12
+
+#Adding Age
+cars["Age"] = (2018-cars["yearOfRegistration"])+cars["monthOfRegistration"]
+cars["Age"] = round(cars["Age"], 2)
+cars["Age"].describe()
+#Since age is deployed therefor removing
+cols1 = ["yearOfRegistration", "monthOfRegistration"]
+cars = cars.drop(columns = cols1, axis = 1)
+cars1 = cars.copy()
+
+#Vissualizing Parameters after narrowing the range form dataframe
+#Age
+sns.distplot(cars["Age"])
+sns.boxplot(y=cars["Age"])
+sns.regplot(x="Age", y="price", scatter=True, fit_reg=False, data=cars1)
+
+#price
+sns.distplot(cars["price"])
+sns.boxplot(y=cars["price"])
+
+#poweerPS
+sns.distplot(cars["powerPS"])
+sns.boxplot(y=cars["powerPS"])
+sns.regplot(x="powerPS", y="price", scatter=True, fit_reg=False, data=cars1)
+
+#=============================================================================
+#Comparing and Analyzing each and every varaible with price
+#And removing Insignificant columns
+#=============================================================================
+
+#seller
+cars["seller"].value_counts()
+pd.crosstab(cars["seller"], columns="count", normalize=True)
+sns.countplot(x="seller", data=cars1)
+sns.boxplot(x="seller", y="price", data=cars1)
+#Fewer cars have commercial which is innsignificant
+#does not affect price as seen in boxplot
+cars1 = cars1.drop(columns=["seller"], axis=1)
+
+#offerType
+cars["offerType"].value_counts()
+pd.crosstab(cars["offerType"], columns="count", normalize=True)
+sns.countplot(x="offerType", data=cars1)
+sns.boxplot(x="offerType", y="price", data=cars1)
+#does not affect price as seen in boxplot
+cars1 = cars1.drop(columns=["offerType"], axis=1)
+
+#abtest
+cars["abtest"].value_counts()
+pd.crosstab(cars["abtest"], columns="count", normalize=True)
+sns.countplot(x="abtest", data=cars1)
+sns.boxplot(x="abtest", y="price", data=cars1)
+#does not affect price as seen in boxplot
+cars1 = cars1.drop(columns=["abtest"], axis=1)
+
+#vehicleType
+cars["vehicleType"].value_counts()
+pd.crosstab(cars["vehicleType"], columns="count", normalize=True)
+sns.countplot(x="vehicleType", data=cars1)
+sns.boxplot(x="vehicleType", y="price", data=cars1)
+#affecting the price
+
+#gearbox
+cars["gearbox"].value_counts()
+pd.crosstab(cars["gearbox"], columns="count", normalize=True)
+sns.countplot(x="gearbox", data=cars1)
+sns.boxplot(x="gearbox", y="price", data=cars1)
+#affecting the price
+
+#model
+cars["model"].value_counts()
+pd.crosstab(cars["model"], columns="count", normalize=True)
+#affecting the price
+
+#kilometer
+cars["kilometer"].value_counts()
+pd.crosstab(cars["kilometer"], columns="count", normalize=True)
+sns.countplot(x="kilometer", data=cars1)
+sns.boxplot(x="kilometer", y="price", data=cars1)
+#affecting the price
+
+#fuelType
+cars["fuelType"].value_counts()
+pd.crosstab(cars["fuelType"], columns="count", normalize=True)
+sns.countplot(x="fuelType", data=cars1)
+sns.boxplot(x="fuelType", y="price", data=cars1)
+#affecting the price
+
+#brand
+cars["brand"].value_counts()
+pd.crosstab(cars["brand"], columns="count", normalize=True)
+sns.countplot(x="brand", data=cars1)
+sns.boxplot(x="price", y="brand", data=cars1)
+#affecting the price
+
+#notRepairedDamage
+cars["notRepairedDamage"].value_counts()
+pd.crosstab(cars["notRepairedDamage"], columns="count", normalize=True)
+sns.countplot(x="notRepairedDamage", data=cars1)
+sns.boxplot(x="notRepairedDamage", y="price", data=cars1)
+#cars wihich have repaired their damage have significantly more value
+
+#============================================================================
+# CORRELATION
+#===========================================================================
+
+
+cars_select = cars.select_dtypes(exclude=[object])
+corelation = cars_select.corr()
+round(corelation, 3)
+cars_select.corr().loc[:, "price"].abs().sort_values(ascending=False)[1:]
+# powerPS have some decent affect on the price i.e 58%
+
+cars1.describe()
+#==============================================================================
+# BUILDING ML MODEL
+#==============================================================================
+
+cars2 = cars1.copy()
+#converting categorical variable in 0/1 format or dummy format
+cars2 = pd.get_dummies(cars1, drop_first=True)
+
+#==============================IMPORTING LIBRARIES=============================
+
+from sklearn.model_selection import train_test_split
+from sklearn.linear_model import LinearRegression
+from sklearn.ensemble import RandomForestRegressor
+from sklearn.metrics import mean_squared_error
+
+#Seprating the values for Linear Regression Model
+x1 = cars2.drop(["price"], axis = "columns", inplace = False )
+y1 = cars2["price"]
+
+#plotting the variable price
+prices = pd.DataFrame({"1. Before": y1, "2. After":np.log(y1)})
+prices.hist()
+
+#Transforming file as a loarithmic value
+y1 = np.log(y1)
+
+#splittting the training and testing data
+x_train, x_test, y_train, y_test = train_test_split(x1, y1, test_size = 0.3, random_state=0)
+
+#findin mean value on test data
+test_mean = np.mean(y_test)
+print(test_mean)
+test_mean = np.repeat(test_mean, len(y_test))
+print(test_mean)
+
+
+#Root mean squared value error
+rmse = np.sqrt(mean_squared_error(y_test, test_mean))
+print(rmse)
+
+linear_reg = LinearRegression(fit_intercept = True)
+
+model_fit = linear_reg.fit(x_train, y_train)
+
+cars_prediction = linear_reg.predict(x_test)
+
+#MSE and RMSE for predictive values
+mse1 = mean_squared_error(y_test, cars_prediction)
+rmse1 = np.sqrt(mse1)
+print(mse1)
+print(rmse1)
+
+# R SQUARED VALUE
+r2_test = model_fit.score(x_test, y_test)
+r2_train = model_fit.score(x_train, y_train)
+
+print(r2_test, r2_train)
+
+#Regression Diaagnostic - Residual plot analysis
+reiduals = y_test - cars_prediction
+sns.regplot(x=cars_prediction, y=reiduals, fit_reg=False, scatter=True)
+reiduals.describe()
+
+#=============================================================================
+# RANDOM FOREST MODEL
+#=============================================================================
+
+rf = RandomForestRegressor(n_estimators=100, max_features="auto",
+ max_depth=100, min_samples_split=10,
+ min_samples_leaf=4, random_state=1)
+
+model_rf = rf.fit(x_train, y_train)
+
+rf_prediction = rf.predict(x_test)
+
+
+#MSE and RMSE for predictive values
+mse1 = mean_squared_error(y_test, rf_prediction)
+rmse1 = np.sqrt(mse1)
+print(mse1)
+print(rmse1)
+
+# R SQUARED VALUE
+r2_test = model_rf.score(x_test, y_test)
+r2_train = model_rf.score(x_train, y_train)
+
+print(r2_test, r2_train)
+
+# END
+
+
+