{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bayes- and Naive Bayes Classifier\n", "\n", "In this notebook a parametric classifier for 1-dimensional input data is developed. The task is to predict the **category of car ($C_i$)**, a customers will purchase, if his **annual income ($x$)** is known. \n", "\n", "The classification shall be realized by applying Bayes-Theorem, which in this context is:\n", "\n", "$$\n", "P(C_i|x)=\\frac{p(x|C_i)P(C_i)}{P(x)} = \\frac{p(x|C_i)P(C_i)}{\\sum_k p(x|C_k)P(C_k)}\n", "$$\n", "\n", "In the **training phase** the gaussian distributed likelihood $p(x|C_i)$ and the a-priori $P(C_i)$ for each of the 3 car classes $C_i$ is estimated from a sample of 27 training instances, each containing the annual income and the purchased car of a former customer. The file containing the training data can be ob obtained from [here](AutoKunden.txt) " ] }, { "cell_type": "markdown", "metadata": { "tags": [ "hide-input" ] }, "source": [ "Required Python modules:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:05.397000Z", "start_time": "2017-10-25T19:08:05.378000Z" }, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "np.set_printoptions(precision=5,suppress=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Access labeled data\n", "Read customer data from file. Each row in the file represents one custoner. The first column is the customer ID, the second column is the annual income of the customer and the third column is the class of car he or she bought: \n", "\n", "* 0 = Low Class\n", "* 1 = Middle Class\n", "* 2 = Premium Class" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "autoDF=pd.read_csv(\"AutoKunden.csv\",index_col=0)#,header=None,names=[\"income\",\"class\"],sep=\" \",index_col=0)\n", "autoDF" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above data shall be applied for training the classifier. **The trained model shall then be applied to classify customers, whose annual income is defined in the list below:**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:13.451000Z", "start_time": "2017-10-25T19:08:13.446000Z" } }, "outputs": [], "source": [ "AnnualIncomeList=[25000,29000,63000,69000] #customers with this annual income shall be classified" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training\n", "In the training-phase for each car-class $C_i$ the likelihood-function $p(x|C_i)$ and the a-priori probability $p(C_i)$ must be determined. It is assumed that the likelihoods are gaussian normal distributions. Hence, for each class the **mean** and the **standard-deviation** must be estimated from the given data. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
classincomeapriori
countmeanstd
class
0819651.6255099.4436090.296296
11242385.00017406.0726450.444444
2777884.00010666.2500440.259259
\n", "
" ], "text/plain": [ " class income apriori\n", " count mean std \n", "class \n", "0 8 19651.625 5099.443609 0.296296\n", "1 12 42385.000 17406.072645 0.444444\n", "2 7 77884.000 10666.250044 0.259259" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classStats=autoDF.groupby(by=\"class\").agg({\"class\":\"count\",\"income\":[\"mean\",\"std\"]})\n", "classStats[\"apriori\"]=classStats[\"class\",\"count\"].apply(lambda x:x/autoDF.shape[0])\n", "classStats" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10,8))\n", "Aposteriori=[]\n", "x=list(range(0,100000,100))\n", "for c in classStats.index:\n", " p=classStats[\"apriori\"].values[c]\n", " m=classStats[\"income\"][\"mean\"].values[c]\n", " s=classStats[\"income\"][\"std\"].values[c]\n", " likelihood = 1.0/(s * np.sqrt(2 * np.pi))*np.exp( - (x - m)**2 / (2 * s**2) )\n", " aposterioriMod=p*likelihood\n", " Aposteriori.append(aposterioriMod)\n", " plt.plot(x,aposterioriMod,label='class '+str(c))\n", "plt.grid(True)\n", "for AnnualIncome in AnnualIncomeList: #plot vertical lines at the annual incomes for which classification is required\n", " plt.axvline(x=AnnualIncome,color='m',ls='dashed')\n", "plt.legend()\n", "plt.xlabel(\"Annual Income\")\n", "plt.ylabel(\"Probability\")\n", "plt.title(\"Likelihood times A-Priori Probability for all 3 classes\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classification (Inference Phase)\n", "\n", "Once the model is trained the likelihood $p(x|C_i)$ and the a-priori probability $P(C_i)$ is known for all 3 classes $C_i$. \n", "\n", "The most probable class is then calculated as follows: \n", "\n", "$$\n", "C_{pred} = argmax_{C_i}\\left( \\frac{p(x|C_i) \\cdot p(C_i)}{p(x)}\\right) = argmax_{C_i}\\left( \\frac{p(x|C_i)P(C_i)}{\\sum_k p(x|C_k)P(C_k)}\\right) \n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the code-cell below, customers with incomes of $25.000.-,29000.-,63000.-$ and $69000.-$ Euro are classified by the learned model:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:21.387000Z", "start_time": "2017-10-25T19:08:21.363000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------\n", "Annual Income = 25000.00\n", "APosteriori propabilitiy of class 0 = 0.6837\n", "APosteriori propabilitiy of class 1 = 0.3163\n", "APosteriori propabilitiy of class 2 = 0.0000\n", "Most probable class for customer with income 25000.00 Euro is 0 \n", "--------------------\n", "Annual Income = 29000.00\n", "APosteriori propabilitiy of class 0 = 0.3630\n", "APosteriori propabilitiy of class 1 = 0.6370\n", "APosteriori propabilitiy of class 2 = 0.0000\n", "Most probable class for customer with income 29000.00 Euro is 1 \n", "--------------------\n", "Annual Income = 63000.00\n", "APosteriori propabilitiy of class 0 = 0.0000\n", "APosteriori propabilitiy of class 1 = 0.5797\n", "APosteriori propabilitiy of class 2 = 0.4203\n", "Most probable class for customer with income 63000.00 Euro is 1 \n", "--------------------\n", "Annual Income = 69000.00\n", "APosteriori propabilitiy of class 0 = 0.0000\n", "APosteriori propabilitiy of class 1 = 0.3159\n", "APosteriori propabilitiy of class 2 = 0.6841\n", "Most probable class for customer with income 69000.00 Euro is 2 \n" ] } ], "source": [ "for AnnualIncome in AnnualIncomeList:\n", " print('-'*20)\n", " print(\"Annual Income = %7.2f\"%AnnualIncome)\n", " i=int(round(AnnualIncome/100))\n", " proVal=[x[i] for x in Aposteriori]\n", " sumProbs=np.sum(proVal)\n", " for i,p in enumerate(proVal):\n", " print('APosteriori propabilitiy of class %d = %1.4f'% (i,p/sumProbs))\n", " print('Most probable class for customer with income %5.2f Euro is %d '% (AnnualIncome,np.argmax(np.array(proVal))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bayesian Classification with Scikit-Learn\n", "For Bayesian Classification Scikit-Learn provides Naive Bayes Classifiers for Gaussian-, Bernoulli- and Multinomial distributed data. In the example above 1-dimensional Gaussian distributed input-data has been applied. In this case the Scikit-Learn Naive Bayes Classifier for Gaussian-distributed data, `GaussianNB` learns the same model as the classifier implemented in the previous sections of this notebook. This is demonstrated in the following code-cells:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:26.005000Z", "start_time": "2017-10-25T19:08:26Z" }, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "from sklearn.naive_bayes import GaussianNB\n", "\n", "Income = np.atleast_2d(autoDF.values[:,0]).T\n", "labels = autoDF.values[:,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train the Naive Bayes Classifier:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:30.599000Z", "start_time": "2017-10-25T19:08:30.588000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/plain": [ "GaussianNB()" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf=GaussianNB()\n", "clf.fit(Income,labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The parameters mean and standarddeviation of the learned likelihoods are:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:33.088000Z", "start_time": "2017-10-25T19:08:33.079000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Learned mean values for each of the 3 classes: \n", " [[19651.625]\n", " [42385. ]\n", " [77884. ]]\n", "Learned standard deviations for each of the 3 classes: \n", " [[ 4770.09278]\n", " [16665.04581]\n", " [ 9875.02871]]\n", "Note that std is slightly different as above. This is because std of pandas divides by (N-1)\n" ] } ], "source": [ "print(\"Learned mean values for each of the 3 classes: \\n\",clf.theta_)\n", "print(\"Learned standard deviations for each of the 3 classes: \\n\",np.sqrt(clf.sigma_))\n", "print(\"Note that std is slightly different as above. This is because std of pandas divides by (N-1)\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Use the trained model for predictions" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:37.348000Z", "start_time": "2017-10-25T19:08:37.336000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Most probable class for annual income of 25000.-Euro is 0\n", "Most probable class for annual income of 29000.-Euro is 1\n", "Most probable class for annual income of 63000.-Euro is 1\n", "Most probable class for annual income of 69000.-Euro is 2\n" ] } ], "source": [ "Income=np.atleast_2d(AnnualIncomeList).T\n", "predictions=clf.predict(Income)\n", "for inc,pre in zip(AnnualIncomeList,predictions):\n", " print(\"Most probable class for annual income of %7d.-Euro is %2d\"%(inc,pre))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `predict(input)`-method returns the estimated class for the given input. If the a-posteriori probability $P(C_i|\\mathbf{x})$ is of interest, the `predict_proba(input)`-method can be applied:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:40.840000Z", "start_time": "2017-10-25T19:08:40.818000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A-Posteriori for class 0: 0.682 ; class 1: 0.318 ; class 3 0.000 for user with income 25000\n", "A-Posteriori for class 0: 0.320 ; class 1: 0.680 ; class 3 0.000 for user with income 29000\n", "A-Posteriori for class 0: 0.000 ; class 1: 0.595 ; class 3 0.405 for user with income 63000\n", "A-Posteriori for class 0: 0.000 ; class 1: 0.298 ; class 3 0.702 for user with income 69000\n" ] } ], "source": [ "predictionsProb=clf.predict_proba(Income)\n", "for i,inc in enumerate(AnnualIncomeList):\n", " print(\"A-Posteriori for class 0: %1.3f ; class 1: %1.3f ; class 3 %1.3f for user with income %7d\"%(predictionsProb[i,0], predictionsProb[i,1],predictionsProb[i,2],inc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model Accuracy on training data" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:44.170000Z", "start_time": "2017-10-25T19:08:44.164000Z" }, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "Income=np.atleast_2d(autoDF.values[:,0]).T\n", "predictions=clf.predict(Income)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:44.998000Z", "start_time": "2017-10-25T19:08:44.991000Z" }, "scrolled": true, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True False True True True False True True True True True False\n", " True True True True False True True True True False True True\n", " False True True]\n" ] } ], "source": [ "correctClassification=predictions==labels\n", "print(correctClassification)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:46.949000Z", "start_time": "2017-10-25T19:08:46.943000Z" }, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "numCorrect=np.sum(correctClassification)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:49.122000Z", "start_time": "2017-10-25T19:08:49.114000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy on training data is: 0.778\n" ] } ], "source": [ "accuracyTrain=float(numCorrect)/autoDF.shape[0]\n", "print(\"Accuracy on training data is: %1.3f\"%accuracyTrain)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:49.951000Z", "start_time": "2017-10-25T19:08:49.940000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/plain": [ "array([[7, 1, 0],\n", " [3, 7, 2],\n", " [0, 0, 7]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "confusion_matrix(y_true=labels,y_pred=predictions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the confusion matrix the entry $C_{i,j}$ in row $i$, column $j$ is the number of instances, which are known to be in class $i$, but predicted to class $j$. For example the confusion matrix above indicates, that 3 elements of true class $1$ have been predicted as class $0$-instances. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cross Validation\n", "The accuracy on training data should not be applied for model evaluation. Instead a model should be evaluated by determining the accuracy (or other performance figures) on data, which has not been applied for training. Since we have only few labeled data in this example cross-validation is applied for determining the model's accuracy:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:08:54.030000Z", "start_time": "2017-10-25T19:08:54.008000Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.66667 0.66667 0.8 0.8 0.8 ]\n" ] } ], "source": [ "from sklearn.model_selection import cross_val_score\n", "clf=GaussianNB()\n", "print(cross_val_score(clf,Income,labels))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Naive Bayes Classifier for Multidimensional data\n", "In the playground-example above the input-features where only one dimensional: The only input feature has been the annual income of a customer. The 1-dimensional case is quite unusual in practice. In the code-cell below a **Naive Bayes Classifier** is evaluated for multidimensional data. This is just to demonstrate that the same process as applied above for the simple dataset, can also be applied for arbitrary complex datasets.\n", "\n", "Again we start from the Bayes Theorem:\n", "\n", "$$\n", "P(C_i|\\mathbf{x})=\\frac{p(\\mathbf{x}|C_i)P(C_i)}{P(\\mathbf{x})}.\n", "$$\n", "\n", "However, the crucial difference to the simple example above is, that not only one random variable $X$ constitutes the input, but many many random variables $X_1,X_2,\\ldots,X_N$. I.e a concrete input is a vector \n", "\n", "$$\n", "\\mathbf{x}=(x_{i_1},x_{i_1},\\ldots,x_{i_N})\n", "$$\n", "\n", "The problem is then: **Of what type is the N-dimensional likelihood $p(\\mathbf{x}|C_i)$ and how to estimate this likelihood?**\n", "\n", "For the general case, where some of the input variables are discrete and others are numeric, there does not exist a joint-likelihood. Therefore, one **naively** assumes that all input variables $X_i$ are independent of each other. Then the N-dimensional likelihood $p(\\mathbf{x}|C_i)$ can be factorised into $N$ 1-dimensional likelihoods and these 1-dimenensional likelihoods can be easily estimated from the given training data (as shown above). This is the widely applied **Naive Bayes Classifier:**\n", "\n", "$$\n", "P(C_i|\\mathbf{x})=\\frac{p(\\mathbf{x}|C_i)}{P(\\mathbf{x})}P(C_i) = \\frac{\\prod_{j=1}^N p(x_j|C_i)}{P(\\mathbf{x})} P(C_i)\n", "$$\n", "\n", " \n", "Below, we apply the [wine dataset](wine.data). This dataset is described [here](wine.names.txt). Actually it is also relatively small, but it contains multidimensional data. \n", "\n", "\n", "In the dataset the results of a chemical analysis of wines grown in the same region in Italy but derived from three different cultivars. The analysis determined the quantities of $N=13$ constituents found in each of the three types of wines. The task is to predict the wine-type (first column of the dataset) from the 13 features, that have been obtained in the chemical analysis." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678910111213
0114.231.712.4315.61272.803.060.282.295.641.043.921065
1113.201.782.1411.21002.652.760.261.284.381.053.401050
2113.162.362.6718.61012.803.240.302.815.681.033.171185
3114.371.952.5016.81133.853.490.242.187.800.863.451480
4113.242.592.8721.01182.802.690.391.824.321.042.93735
.............................................
173313.715.652.4520.5951.680.610.521.067.700.641.74740
174313.403.912.4823.01021.800.750.431.417.300.701.56750
175313.274.282.2620.01201.590.690.431.3510.200.591.56835
176313.172.592.3720.01201.650.680.531.469.300.601.62840
177314.134.102.7424.5962.050.760.561.359.200.611.60560
\n", "

178 rows × 14 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 9 10 11 \\\n", "0 1 14.23 1.71 2.43 15.6 127 2.80 3.06 0.28 2.29 5.64 1.04 \n", "1 1 13.20 1.78 2.14 11.2 100 2.65 2.76 0.26 1.28 4.38 1.05 \n", "2 1 13.16 2.36 2.67 18.6 101 2.80 3.24 0.30 2.81 5.68 1.03 \n", "3 1 14.37 1.95 2.50 16.8 113 3.85 3.49 0.24 2.18 7.80 0.86 \n", "4 1 13.24 2.59 2.87 21.0 118 2.80 2.69 0.39 1.82 4.32 1.04 \n", ".. .. ... ... ... ... ... ... ... ... ... ... ... \n", "173 3 13.71 5.65 2.45 20.5 95 1.68 0.61 0.52 1.06 7.70 0.64 \n", "174 3 13.40 3.91 2.48 23.0 102 1.80 0.75 0.43 1.41 7.30 0.70 \n", "175 3 13.27 4.28 2.26 20.0 120 1.59 0.69 0.43 1.35 10.20 0.59 \n", "176 3 13.17 2.59 2.37 20.0 120 1.65 0.68 0.53 1.46 9.30 0.60 \n", "177 3 14.13 4.10 2.74 24.5 96 2.05 0.76 0.56 1.35 9.20 0.61 \n", "\n", " 12 13 \n", "0 3.92 1065 \n", "1 3.40 1050 \n", "2 3.17 1185 \n", "3 3.45 1480 \n", "4 2.93 735 \n", ".. ... ... \n", "173 1.74 740 \n", "174 1.56 750 \n", "175 1.56 835 \n", "176 1.62 840 \n", "177 1.60 560 \n", "\n", "[178 rows x 14 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "wineDataFrame=pd.read_csv(\"wine.data\",header=None)\n", "wineDataFrame" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:09:02.356000Z", "start_time": "2017-10-25T19:09:02.351000Z" }, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "wineData=wineDataFrame.values\n", "print(wineData.shape)\n", "\n", "features=wineData[:,1:] #features are in columns 1 to end\n", "labels=wineData[:,0] #class label is in column 0" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2017-10-25T19:09:03.207000Z", "start_time": "2017-10-25T19:09:03.168000Z" }, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "clf=GaussianNB()\n", "acc=cross_val_score(clf,features,labels,cv=5)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mean Accuracy is 0.9663492063492063\n" ] } ], "source": [ "print(\"Mean Accuracy is \",acc.mean())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Tags", "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.8.5" }, "nav_menu": {}, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": false }, "toc_position": { "height": "485px", "left": "0px", "right": "1068px", "top": "125px", "width": "212px" } }, "nbformat": 4, "nbformat_minor": 1 }