{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "d9fa787a", "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "******************** Train Data read ********************\n", " LOC_BLANK BRANCH_COUNT CALL_PAIRS LOC_CODE_AND_COMMENT LOC_COMMENTS \\\n", "0 25 9 1 7 9 \n", "1 7 9 1 2 0 \n", "2 20 33 7 8 49 \n", "3 0 3 0 0 0 \n", "4 3 3 2 0 1 \n", ".. ... ... ... ... ... \n", "732 16 19 6 5 12 \n", "733 36 27 1 11 24 \n", "734 9 3 3 0 3 \n", "735 4 21 2 0 0 \n", "736 1 13 4 0 1 \n", "\n", " CONDITION_COUNT CYCLOMATIC_COMPLEXITY CYCLOMATIC_DENSITY \\\n", "0 16 5 0.21 \n", "1 14 5 0.56 \n", "2 58 17 0.17 \n", "3 4 2 0.25 \n", "4 4 2 0.15 \n", ".. ... ... ... \n", "732 24 11 0.28 \n", "733 44 14 0.26 \n", "734 4 2 0.10 \n", "735 40 11 0.52 \n", "736 16 7 0.47 \n", "\n", " DECISION_COUNT DECISION_DENSITY ... NODE_COUNT \\\n", "0 8 2.00 ... 16 \n", "1 6 2.33 ... 11 \n", "2 26 2.23 ... 67 \n", "3 2 2.00 ... 7 \n", "4 2 2.00 ... 10 \n", ".. ... ... ... ... \n", "732 10 2.40 ... 28 \n", "733 18 2.44 ... 39 \n", "734 2 2.00 ... 12 \n", "735 20 2.00 ... 34 \n", "736 4 4.00 ... 16 \n", "\n", " NORMALIZED_CYLOMATIC_COMPLEXITY NUM_OPERANDS NUM_OPERATORS \\\n", "0 0.08 44 49 \n", "1 0.29 24 30 \n", "2 0.10 172 223 \n", "3 0.22 23 24 \n", "4 0.11 32 36 \n", ".. ... ... ... \n", "732 0.16 63 88 \n", "733 0.12 89 120 \n", "734 0.06 67 71 \n", "735 0.42 60 65 \n", "736 0.39 27 37 \n", "\n", " NUM_UNIQUE_OPERANDS NUM_UNIQUE_OPERATORS NUMBER_OF_LINES \\\n", "0 23 16 59 \n", "1 9 14 17 \n", "2 67 20 171 \n", "3 8 8 9 \n", "4 16 15 18 \n", ".. ... ... ... \n", "732 33 24 68 \n", "733 30 25 115 \n", "734 32 14 33 \n", "735 20 18 26 \n", "736 15 13 18 \n", "\n", " PERCENT_COMMENTS LOC_TOTAL Defective \n", "0 48.48 24 N \n", "1 22.22 9 N \n", "2 38.00 101 N \n", "3 0.00 8 N \n", "4 7.14 13 N \n", ".. ... ... ... \n", "732 33.33 39 N \n", "733 44.87 54 N \n", "734 13.04 20 Y \n", "735 0.00 21 N \n", "736 6.25 15 N \n", "\n", "[737 rows x 38 columns]\n", "******************** Test Data read ********************\n", " LOC_BLANK BRANCH_COUNT CALL_PAIRS LOC_CODE_AND_COMMENT LOC_COMMENTS \\\n", "0 5 3 2 0 0 \n", "1 2 33 6 2 0 \n", "2 1 3 4 0 19 \n", "3 2 7 1 0 0 \n", "4 13 5 2 4 0 \n", ".. ... ... ... ... ... \n", "311 1 3 3 0 0 \n", "312 6 37 2 5 4 \n", "313 18 14 9 2 19 \n", "314 5 13 4 3 5 \n", "315 1 3 1 0 0 \n", "\n", " CONDITION_COUNT CYCLOMATIC_COMPLEXITY CYCLOMATIC_DENSITY \\\n", "0 4 2 0.14 \n", "1 58 17 0.47 \n", "2 4 2 0.08 \n", "3 12 4 0.57 \n", "4 8 3 0.21 \n", ".. ... ... ... \n", "311 4 2 0.33 \n", "312 60 19 0.23 \n", "313 18 8 0.16 \n", "314 24 7 0.29 \n", "315 4 2 0.22 \n", "\n", " DECISION_COUNT DECISION_DENSITY ... NODE_COUNT \\\n", "0 2 2.00 ... 9 \n", "1 26 2.23 ... 53 \n", "2 2 2.00 ... 15 \n", "3 6 2.00 ... 12 \n", "4 4 2.00 ... 11 \n", ".. ... ... ... ... \n", "311 2 2.00 ... 8 \n", "312 24 2.50 ... 46 \n", "313 8 2.25 ... 27 \n", "314 12 2.00 ... 27 \n", "315 2 2.00 ... 6 \n", "\n", " NORMALIZED_CYLOMATIC_COMPLEXITY NUM_OPERANDS NUM_OPERATORS \\\n", "0 0.10 17 33 \n", "1 0.44 89 107 \n", "2 0.04 73 81 \n", "3 0.40 14 22 \n", "4 0.11 26 35 \n", ".. ... ... ... \n", "311 0.25 9 14 \n", "312 0.20 116 150 \n", "313 0.09 53 74 \n", "314 0.20 49 77 \n", "315 0.18 17 26 \n", "\n", " NUM_UNIQUE_OPERANDS NUM_UNIQUE_OPERATORS NUMBER_OF_LINES \\\n", "0 12 13 20 \n", "1 30 25 39 \n", "2 34 15 45 \n", "3 5 14 10 \n", "4 19 14 28 \n", ".. ... ... ... \n", "311 9 9 8 \n", "312 46 21 93 \n", "313 40 22 88 \n", "314 20 18 35 \n", "315 12 15 11 \n", "\n", " PERCENT_COMMENTS LOC_TOTAL Defective \n", "0 0.00 14 N \n", "1 5.56 36 N \n", "2 44.19 24 N \n", "3 0.00 7 N \n", "4 28.57 14 N \n", ".. ... ... ... \n", "311 0.00 6 N \n", "312 10.47 82 N \n", "313 30.43 50 N \n", "314 27.59 24 N \n", "315 0.00 9 N \n", "\n", "[316 rows x 38 columns]\n", " LOC_BLANK BRANCH_COUNT CALL_PAIRS LOC_CODE_AND_COMMENT LOC_COMMENTS \\\n", "0 25 9 1 7 9 \n", "1 7 9 1 2 0 \n", "2 20 33 7 8 49 \n", "3 0 3 0 0 0 \n", "4 3 3 2 0 1 \n", ".. ... ... ... ... ... \n", "732 16 19 6 5 12 \n", "733 36 27 1 11 24 \n", "734 9 3 3 0 3 \n", "735 4 21 2 0 0 \n", "736 1 13 4 0 1 \n", "\n", " CONDITION_COUNT CYCLOMATIC_COMPLEXITY CYCLOMATIC_DENSITY \\\n", "0 16 5 0.21 \n", "1 14 5 0.56 \n", "2 58 17 0.17 \n", "3 4 2 0.25 \n", "4 4 2 0.15 \n", ".. ... ... ... \n", "732 24 11 0.28 \n", "733 44 14 0.26 \n", "734 4 2 0.10 \n", "735 40 11 0.52 \n", "736 16 7 0.47 \n", "\n", " DECISION_COUNT DECISION_DENSITY ... MULTIPLE_CONDITION_COUNT \\\n", "0 8 2.00 ... 8 \n", "1 6 2.33 ... 7 \n", "2 26 2.23 ... 29 \n", "3 2 2.00 ... 2 \n", "4 2 2.00 ... 2 \n", ".. ... ... ... ... \n", "732 10 2.40 ... 12 \n", "733 18 2.44 ... 22 \n", "734 2 2.00 ... 2 \n", "735 20 2.00 ... 20 \n", "736 4 4.00 ... 8 \n", "\n", " NODE_COUNT NORMALIZED_CYLOMATIC_COMPLEXITY NUM_OPERANDS NUM_OPERATORS \\\n", "0 16 0.08 44 49 \n", "1 11 0.29 24 30 \n", "2 67 0.10 172 223 \n", "3 7 0.22 23 24 \n", "4 10 0.11 32 36 \n", ".. ... ... ... ... \n", "732 28 0.16 63 88 \n", "733 39 0.12 89 120 \n", "734 12 0.06 67 71 \n", "735 34 0.42 60 65 \n", "736 16 0.39 27 37 \n", "\n", " NUM_UNIQUE_OPERANDS NUM_UNIQUE_OPERATORS NUMBER_OF_LINES \\\n", "0 23 16 59 \n", "1 9 14 17 \n", "2 67 20 171 \n", "3 8 8 9 \n", "4 16 15 18 \n", ".. ... ... ... \n", "732 33 24 68 \n", "733 30 25 115 \n", "734 32 14 33 \n", "735 20 18 26 \n", "736 15 13 18 \n", "\n", " PERCENT_COMMENTS LOC_TOTAL \n", "0 48.48 24 \n", "1 22.22 9 \n", "2 38.00 101 \n", "3 0.00 8 \n", "4 7.14 13 \n", ".. ... ... \n", "732 33.33 39 \n", "733 44.87 54 \n", "734 13.04 20 \n", "735 0.00 21 \n", "736 6.25 15 \n", "\n", "[737 rows x 37 columns]\n", " LOC_BLANK BRANCH_COUNT CALL_PAIRS LOC_CODE_AND_COMMENT LOC_COMMENTS \\\n", "0 5 3 2 0 0 \n", "1 2 33 6 2 0 \n", "2 1 3 4 0 19 \n", "3 2 7 1 0 0 \n", "4 13 5 2 4 0 \n", ".. ... ... ... ... ... \n", "311 1 3 3 0 0 \n", "312 6 37 2 5 4 \n", "313 18 14 9 2 19 \n", "314 5 13 4 3 5 \n", "315 1 3 1 0 0 \n", "\n", " CONDITION_COUNT CYCLOMATIC_COMPLEXITY CYCLOMATIC_DENSITY \\\n", "0 4 2 0.14 \n", "1 58 17 0.47 \n", "2 4 2 0.08 \n", "3 12 4 0.57 \n", "4 8 3 0.21 \n", ".. ... ... ... \n", "311 4 2 0.33 \n", "312 60 19 0.23 \n", "313 18 8 0.16 \n", "314 24 7 0.29 \n", "315 4 2 0.22 \n", "\n", " DECISION_COUNT DECISION_DENSITY ... MULTIPLE_CONDITION_COUNT \\\n", "0 2 2.00 ... 2 \n", "1 26 2.23 ... 29 \n", "2 2 2.00 ... 2 \n", "3 6 2.00 ... 6 \n", "4 4 2.00 ... 4 \n", ".. ... ... ... ... \n", "311 2 2.00 ... 2 \n", "312 24 2.50 ... 30 \n", "313 8 2.25 ... 9 \n", "314 12 2.00 ... 12 \n", "315 2 2.00 ... 2 \n", "\n", " NODE_COUNT NORMALIZED_CYLOMATIC_COMPLEXITY NUM_OPERANDS NUM_OPERATORS \\\n", "0 9 0.10 17 33 \n", "1 53 0.44 89 107 \n", "2 15 0.04 73 81 \n", "3 12 0.40 14 22 \n", "4 11 0.11 26 35 \n", ".. ... ... ... ... \n", "311 8 0.25 9 14 \n", "312 46 0.20 116 150 \n", "313 27 0.09 53 74 \n", "314 27 0.20 49 77 \n", "315 6 0.18 17 26 \n", "\n", " NUM_UNIQUE_OPERANDS NUM_UNIQUE_OPERATORS NUMBER_OF_LINES \\\n", "0 12 13 20 \n", "1 30 25 39 \n", "2 34 15 45 \n", "3 5 14 10 \n", "4 19 14 28 \n", ".. ... ... ... \n", "311 9 9 8 \n", "312 46 21 93 \n", "313 40 22 88 \n", "314 20 18 35 \n", "315 12 15 11 \n", "\n", " PERCENT_COMMENTS LOC_TOTAL \n", "0 0.00 14 \n", "1 5.56 36 \n", "2 44.19 24 \n", "3 0.00 7 \n", "4 28.57 14 \n", ".. ... ... \n", "311 0.00 6 \n", "312 10.47 82 \n", "313 30.43 50 \n", "314 27.59 24 \n", "315 0.00 9 \n", "\n", "[316 rows x 37 columns]\n", "0 N\n", "1 N\n", "2 N\n", "3 N\n", "4 N\n", " ..\n", "732 N\n", "733 N\n", "734 Y\n", "735 N\n", "736 N\n", "Name: Defective, Length: 737, dtype: object\n", "0 N\n", "1 N\n", "2 N\n", "3 N\n", "4 N\n", " ..\n", "311 N\n", "312 N\n", "313 N\n", "314 N\n", "315 N\n", "Name: Defective, Length: 316, dtype: object\n", "{'estimators': [['RF:', RandomForestClassifier(max_depth=10, max_features=None, n_estimators=500,\n", " random_state=0)], ['SVM:', SVC(C=2, kernel='poly', probability=True, random_state=0)], ['NBG:', GaussianNB()]], 'flatten_transform': True, 'n_jobs': None, 'verbose': 1, 'voting': 'soft', 'weights': None, 'RF:': RandomForestClassifier(max_depth=10, max_features=None, n_estimators=500,\n", " random_state=0), 'SVM:': SVC(C=2, kernel='poly', probability=True, random_state=0), 'NBG:': GaussianNB(), 'RF:__bootstrap': True, 'RF:__ccp_alpha': 0.0, 'RF:__class_weight': None, 'RF:__criterion': 'gini', 'RF:__max_depth': 10, 'RF:__max_features': None, 'RF:__max_leaf_nodes': None, 'RF:__max_samples': None, 'RF:__min_impurity_decrease': 0.0, 'RF:__min_samples_leaf': 1, 'RF:__min_samples_split': 2, 'RF:__min_weight_fraction_leaf': 0.0, 'RF:__n_estimators': 500, 'RF:__n_jobs': None, 'RF:__oob_score': False, 'RF:__random_state': 0, 'RF:__verbose': 0, 'RF:__warm_start': False, 'SVM:__C': 2, 'SVM:__break_ties': False, 'SVM:__cache_size': 200, 'SVM:__class_weight': None, 'SVM:__coef0': 0.0, 'SVM:__decision_function_shape': 'ovr', 'SVM:__degree': 3, 'SVM:__gamma': 'scale', 'SVM:__kernel': 'poly', 'SVM:__max_iter': -1, 'SVM:__probability': True, 'SVM:__random_state': 0, 'SVM:__shrinking': True, 'SVM:__tol': 0.001, 'SVM:__verbose': False, 'NBG:__priors': None, 'NBG:__var_smoothing': 1e-09}\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[Voting] ...................... (1 of 3) Processing RF:, total= 7.7s\n", "[Voting] ..................... (2 of 3) Processing SVM:, total= 1.2s\n", "[Voting] ..................... (3 of 3) Processing NBG:, total= 0.0s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "precision is: 1.0\n", "Recall is: 0.9\n", "Area under curve(AUC): 0.98\n", "F-Measure is: 0.95\n", "\n", " precision recall f1-score support\n", "\n", " N 0.99 1.00 0.99 646\n", " Y 1.00 0.90 0.95 91\n", "\n", " accuracy 0.99 737\n", " macro avg 0.99 0.95 0.97 737\n", "weighted avg 0.99 0.99 0.99 737\n", "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "precision is: 0.59\n", "Recall is: 0.33\n", "Area under curve(AUC): 0.81\n", "F-Measure is: 0.43\n", "\n", " precision recall f1-score support\n", "\n", " N 0.91 0.97 0.94 277\n", " Y 0.59 0.33 0.43 39\n", "\n", " accuracy 0.89 316\n", " macro avg 0.75 0.65 0.68 316\n", "weighted avg 0.87 0.89 0.88 316\n", "\n", "Traininng Accuracy is 98.78\n", "Testing accuracy is 88.92\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn import metrics\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.ensemble import VotingClassifier\n", "from sklearn import svm\n", "from sklearn.svm import SVC\n", "from sklearn.naive_bayes import GaussianNB\n", "from scipy.stats import randint\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.metrics import confusion_matrix\n", "from sklearn.metrics import precision_score\n", "from sklearn.metrics import recall_score\n", "from sklearn.metrics import f1_score\n", "from sklearn.metrics import classification_report\n", "from sklearn.metrics import roc_auc_score\n", "import matplotlib\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import ConfusionMatrixDisplay\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.preprocessing import MinMaxScaler\n", "\n", "\n", "#-----------Fetching train and test data from root directory---------------#\n", "\n", "dataset_url = \"./PC3_Train.csv\" #this source will change for respective dataset\n", "train_data = pd.read_csv(dataset_url)\n", "print(\"*\" * 20 + ' Train Data read ' + \"*\" * 20)\n", "print(train_data)\n", "\n", "\n", "dataset_url = \"./PC3_Test.csv\" #this source will change for respective dataset\n", "test_data = pd.read_csv(dataset_url)\n", "print(\"*\" * 20 + ' Test Data read ' + \"*\" * 20)\n", "print(test_data);\n", "\n", "#X_train, X_test has training & testing data\n", "X_train=train_data.drop(columns='Defective')\n", "print(X_train)\n", "X_test = test_data.drop(columns='Defective')\n", "print(X_test);\n", "\n", "#Y_train, Y_test has train/test class lables \n", "Y_train = train_data[\"Defective\"]\n", "Y_test = test_data[\"Defective\"]\n", "print(Y_train)\n", "print(Y_test)\n", "\n", "\n", "\n", "#---------------applying voting ensemble---------------------#\n", "\n", "\n", "voting_classifiers=[\n", " ['RF:',RandomForestClassifier(criterion=\"gini\",max_depth=10,n_estimators=500,max_features=None,random_state=0)],\n", " ['SVM:',svm.SVC(kernel='poly', C=2,probability=True,random_state=0)],\n", " ['NBG:',GaussianNB()]]\n", " \n", "clf=VotingClassifier(estimators=voting_classifiers, voting='soft',verbose=1,)\n", "print(clf.get_params())\n", "\n", "#----------------training model--------------------------#\n", "\n", "clf=clf.fit(X_train,Y_train)\n", "\n", "\n", "#----------------get training predictios-----------------#\n", "\n", "training_predictions= clf.predict(X_train)\n", "#print(training_predictions);\n", "\n", "#-----------------generate training confusion matrix--------#\n", "\n", "confusion_matrix(Y_train,training_predictions,labels = ['N','Y'])\n", "\n", "\n", "#----------------draw training confusion matrix--------------#\n", "\n", "conf_matrix = confusion_matrix(Y_train,training_predictions)\n", "fig, ax = plt.subplots(figsize=(3.5, 3.5))\n", "ax.matshow(conf_matrix, cmap=plt.cm.Blues, alpha=0.3)\n", "for i in range(conf_matrix.shape[0]):\n", " for j in range(conf_matrix.shape[1]):\n", " ax.text(x=j, y=i,s=conf_matrix[i, j], va='center', ha='center', size='xx-large')\n", "\n", "plt.xlabel('Predictions', fontsize=18)\n", "plt.ylabel('Actuals', fontsize=18)\n", "plt.title('Confusion Matrix', fontsize=18)\n", "plt.show()\n", "\n", "#-----------------get evaluation matrix of training data------------------#\n", "\n", "#precision\n", "precision = precision_score(Y_train,training_predictions,pos_label='Y')\n", "print (\"precision is: \" + str(round(precision,2)))\n", "\n", "\n", "#recall\n", "recall = recall_score(Y_train,training_predictions,pos_label='Y')\n", "print (\"Recall is: \" + str(round(recall,2)))\n", "\n", "\n", "# predict probabilities\n", "pred_prob = clf.predict_proba(X_train)[::,1]\n", "#print(pred_prob)\n", "\n", "# auc scores\n", "auc = metrics.roc_auc_score(Y_train, pred_prob)\n", "print(\"Area under curve(AUC): \" + str(round(auc,2)))\n", "\n", "f_measure=f1_score(Y_train, training_predictions,pos_label='Y')\n", "print (\"F-Measure is: \" + str(round(f_measure,2))+'\\n')\n", "\n", "print(classification_report(Y_train,training_predictions))\n", "\n", "\n", "\n", "#------------------get test predictions--------------------#\n", "\n", "predictions = clf.predict(X_test)\n", "#print(predictions);\n", "\n", "#--------------generate test confusion matrix---------------#\n", "\n", "confusion_matrix(Y_test,predictions,labels = ['N','Y'])\n", "\n", "#--------------draw test confusion matrix------------------#\n", "\n", "conf_matrix = confusion_matrix(Y_test, predictions)\n", "fig, ax = plt.subplots(figsize=(3.5, 3.5))\n", "ax.matshow(conf_matrix, cmap=plt.cm.Blues, alpha=0.3)\n", "for i in range(conf_matrix.shape[0]):\n", " for j in range(conf_matrix.shape[1]):\n", " ax.text(x=j, y=i,s=conf_matrix[i, j], va='center', ha='center', size='xx-large')\n", "\n", "plt.xlabel('Predictions', fontsize=18)\n", "plt.ylabel('Actuals', fontsize=18)\n", "plt.title('Confusion Matrix', fontsize=18)\n", "plt.show()\n", "\n", "\n", "#-----------------get evaluation matrix of testing data------------------#\n", "\n", "#precision\n", "precision = precision_score(Y_test,predictions,pos_label='Y')\n", "print (\"precision is: \" + str(round(precision,2)))\n", "\n", "\n", "#recall\n", "recall = recall_score(Y_test,predictions,pos_label='Y')\n", "print (\"Recall is: \" + str(round(recall,2)))\n", "\n", "\n", "# predict probabilities\n", "pred_prob = clf.predict_proba(X_test)[::,1]\n", "#print(pred_prob)\n", "\n", "# auc scores\n", "auc = metrics.roc_auc_score(Y_test, pred_prob)\n", "print(\"Area under curve(AUC): \" + str(round(auc,2)))\n", "\n", "f_measure=f1_score(Y_test, predictions,pos_label='Y')\n", "print (\"F-Measure is: \" + str(round(f_measure,2))+'\\n')\n", "\n", "print(classification_report(Y_test,predictions))\n", "\n", "#--------------------get training accuracy-------------------#\n", "\n", "tarining_accuracy=clf.score(X_train, Y_train)\n", "#print(tarining_accuracy*100)\n", "print(\"Traininng Accuracy is \" +str(round(tarining_accuracy*100,2)));\n", "\n", "#--------------------get testing accuracy-------------------#\n", "\n", "testing_accuracy=accuracy_score(Y_test, predictions)\n", "#print(testing_accuracy*100)\n", "print(\"Testing accuracy is \" + str(round(testing_accuracy*100,2)));\n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "4ae85dd9", "metadata": {}, "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", "
Unnamed: 0test_predictionsActual Values
00NN
11NN
22NN
33NN
44NN
\n", "
" ], "text/plain": [ " Unnamed: 0 test_predictions Actual Values\n", "0 0 N N\n", "1 1 N N\n", "2 2 N N\n", "3 3 N N\n", "4 4 N N" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = pd.DataFrame(predictions, columns=['test_predictions'])\n", "pred[\"Actual Values\"] = Y_test;\n", "pred.to_csv('test_prediction.csv')\n", "\n", "aa = pd.read_csv(\"test_prediction.csv\")\n", "aa.head()" ] }, { "cell_type": "code", "execution_count": null, "id": "6c8486de", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.2" } }, "nbformat": 4, "nbformat_minor": 5 }