Skip to content

Instantly share code, notes, and snippets.

@ggodreau
Created July 25, 2017 15:54
Show Gist options
  • Save ggodreau/5fb3fdf0530adedced73b8228a553a5b to your computer and use it in GitHub Desktop.
Save ggodreau/5fb3fdf0530adedced73b8228a553a5b to your computer and use it in GitHub Desktop.
GA Task 1 - see full repo at https://github.com/ggodreau/ga
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Part 1: Modeling Challenge\n",
"\n",
"1.) Use at least two classification techniques; compare and contrast the advantages and disadvantages of each.\n",
"\n",
"LR - doesn't require normally distributed target class, nor factors that are normally distributed or bounded, however is susceptible to overfitting. \n",
"RF - has built in methods for balancing error in unbalanced factors/classes, as well as gives feature importance estimates. Can also overfit like LR.\n",
"\n",
"2.) Identify how you would control for overfitting in each classification technique.\n",
"\n",
"LR - use l1/l2 regularization and C parameter\n",
"RF - use n_estimators to manage forest complexity, with CV / test accuracy as a feedback\n",
"\n",
"3.) Evaluate the performance of each model.\n",
"\n",
"Please see below\n",
"\n",
"4.) In each model, identify the most important predictive variables and explain how you identified them.\n",
"\n",
"Please see below\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"from sklearn.utils import resample\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.preprocessing import StandardScaler\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.model_selection import cross_val_score\n",
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.covariance import empirical_covariance\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib import patches\n",
"from numpy import array, random, take"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data input and preprocessing"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"X_train.shape (455, 30)\n",
"X_test.shape (114, 30)\n",
"y_train.shape (455,)\n",
"y_test.shape (114,)\n"
]
}
],
"source": [
"# read in external header file, data, and merge during import\n",
"with open(\"field_names.txt\") as file:\n",
" headerNames = [line.strip() for line in file]\n",
"data = pd.read_csv('breast-cancer.csv', names=headerNames)\n",
"\n",
"# drop ID field, map diagnosis; malignant = 1, benign = 0, drop na's (none)\n",
"data.drop(\"ID\", axis=1, inplace=True)\n",
"data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})\n",
"data.dropna(inplace=True)\n",
"\n",
"# split into X, y, test/train split, using 80/20 test/train split\n",
"X = array(data.drop(['diagnosis'], 1))\n",
"y = array(data['diagnosis'])\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)\n",
"\n",
"# sanity check on array sizes\n",
"print(\"X_train.shape\", X_train.shape),\n",
"print(\"X_test.shape\", X_test.shape),\n",
"print(\"y_train.shape\", y_train.shape),\n",
"print(\"y_test.shape\", y_test.shape)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Mean: 2.00, smoothness_mean, malignant = 0\n",
"Median: 1.85, smoothness_mean, malignant = 0\n",
"Mean: 4.32, smoothness_mean, malignant = 1\n",
"Median: 3.68, smoothness_mean, malignant = 1\n",
"Mean: 0.02, compactness_mean, malignant = 0\n",
"Median: 0.02, compactness_mean, malignant = 0\n",
"Mean: 0.03, compactness_mean, malignant = 1\n",
"Median: 0.03, compactness_mean, malignant = 1\n"
]
},
{
"data": {
"text/plain": [
"array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f45e83f9d30>,\n",
" <matplotlib.axes._subplots.AxesSubplot object at 0x7f45e5a62860>],\n",
" [<matplotlib.axes._subplots.AxesSubplot object at 0x7f45e5a43710>,\n",
" <matplotlib.axes._subplots.AxesSubplot object at 0x7f45e59bd3c8>]], dtype=object)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f45e83f95c0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# show differences in mean/median between malignant/benign smoothness and compactness\n",
"# we have a ~2.2[unit] difference for mean smoothness, 0.01[unit] diff for mean compactness\n",
"factors = ['smoothness_mean', 'compactness_mean']\n",
"diagnoses = [0,1]\n",
"\n",
"for factor in factors:\n",
" for diagnosis in diagnoses:\n",
" print('Mean: %.2f, %s, malignant = %s' %(data[factor].loc[data['diagnosis'] == diagnosis].mean(), factor, diagnosis))\n",
" print('Median: %.2f, %s, malignant = %s' %(data[factor].loc[data['diagnosis'] == diagnosis].median(), factor, diagnosis))\n",
" \n",
"mb_map = {0: \"green\", 1: \"red\"}\n",
"colors = data[\"diagnosis\"].map(lambda x: mb_map.get(x))\n",
"pd.plotting.scatter_matrix(data.filter(items=['smoothness_mean', 'compactness_mean']), c=colors, alpha=0.2, figsize=(5, 5), diagonal='kde')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create bootstrapping function"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# bootstrap function reads in numpy array and returns n bootstrapped samples\n",
"# note this is with replacement\n",
"def bootstrap(array, n):\n",
" if n > array.shape[0]:\n",
" n = array.shape[0]\n",
" return array.take(random.randint(0, y.shape[0], n), axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[3, 5, 4],\n",
" [0, 2, 2],\n",
" [8, 7, 6],\n",
" [0, 2, 2]])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# demonstration\n",
"y = array([[0, 2, 2], [3, 5, 4], [8, 7, 6], [1, 4, 6], [2, 5, 7]])\n",
"bootstrap(y, 4)\n",
"\n",
"# example use on supplied data set (not executed for brevity)\n",
"# bootstrap(X_train, 4)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Feature correlation"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"fractal_dimension_mean 0.793566\n",
"concave_points_sd_error 0.782914\n",
"perimeter_sd_error 0.776614\n",
"concavity_worst 0.776454\n",
"radius_worst 0.742636\n",
"concave_points_worst 0.733825\n",
"radius_mean 0.730029\n",
"texture_mean 0.708984\n",
"perimeter_mean 0.696360\n",
"symmetry_worst 0.659610\n",
"Name: diagnosis, dtype: float64"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# output top 10 correlated factors to diagnosis, simple pearson's correlation\n",
"data.corr().iloc[:,0].tail(len(data.corr().iloc[:,0])-1).sort_values(ascending=False).head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Visually show predictive features\n",
"Here we can see the top 3 correlated features, dictated by the above Pearson's correlation coefficient pareto, to our target diagnosis class. Further investigation is needed to determine if this correlation is actually causation."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f45e5923438>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# put top 3 features from pearson's feature correllation, put into a list for plot\n",
"best_features = data.corr().iloc[:,0].tail(len(data.corr().iloc[:,0])-1).sort_values(ascending=False).head(3).index.tolist()\n",
"\n",
"# plot top 3 predictive features for prediction of malignant/benign diagnosis\n",
"# need units added to charts here in the future\n",
"plt.figure(figsize=(15, 10))\n",
"\n",
"for idx, feature in enumerate(best_features):\n",
" plt.subplot(3,3,idx+1)\n",
" plt.title(feature)\n",
" plt.legend(handles = [patches.Patch(label = 'Malignant', color=('red')),\n",
" patches.Patch(label = 'Benign', color=('green'))])\n",
" m = data[data['diagnosis'] == 1][feature]\n",
" b = data[data['diagnosis'] == 0][feature]\n",
" plt.hist(m, color=('red'), stacked=True, normed = True)\n",
" plt.hist(b, color=('green'), stacked=True, normed = True)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create and tune a Logistic Regression model "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# create a scoring helper function\n",
"def get_clf_score(pipeline):\n",
" clf_pipe = pipeline\n",
" clf_pipe_model = clf_pipe.fit(X_train, y_train)\n",
" clf_test_score = clf_pipe_model.score(X=X_test, y=y_test)\n",
" clf_cv_score = cross_val_score(clf_pipe, X_train, y=y_train, cv=10).mean()\n",
" score = {'test': clf_test_score, 'cv': clf_cv_score}\n",
" print('Accuracy against train set, CV: %.3f' %(score['cv']))\n",
" print('Accuracy against test test: %.3f' %(score['test']))\n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# define untuned model pipeline\n",
"pipe_lr = Pipeline([('scl', StandardScaler()),\n",
" ('pca', PCA(n_components=15)),\n",
" ('clf', LogisticRegression(random_state=1))])"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best grid search accuracy of 0.980, C of 0.10, l2 penalty\n",
"\n",
"Untuned Model:\n",
"Accuracy against train set, CV: 0.978\n",
"Accuracy against test test: 0.982\n",
"\n",
"Tuned Model:\n",
"Accuracy against train set, CV: 0.980\n",
"Accuracy against test test: 0.974\n"
]
}
],
"source": [
"# define tuned model pipeline using a grid search\n",
"lr_grid_params = {'clf__penalty': ['l1', 'l2'], \n",
" 'clf__C': [0.001,0.01,0.1,1,10,100]}\n",
"lr_grid_obj = GridSearchCV(estimator=pipe_lr,\n",
" param_grid=lr_grid_params,\n",
" scoring='accuracy',\n",
" cv=10)\n",
"lr_grid_model = lr_grid_obj.fit(X_train, y_train)\n",
"print('Best grid search accuracy of %.3f, C of %.2f, %s penalty\\n' \n",
" %(lr_grid_model.best_score_, \n",
" lr_grid_model.best_params_['clf__C'], \n",
" lr_grid_model.best_params_['clf__penalty']))\n",
"\n",
"# get stats of untuned and tuned model\n",
"print('Untuned Model:')\n",
"get_clf_score(pipe_lr)\n",
"print('')\n",
"print('Tuned Model:')\n",
"get_clf_score(lr_grid_model.best_estimator_)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"symmetry_worst 1.219852\n",
"symmetry_sd_error 0.869772\n",
"perimeter_mean 0.495614\n",
"fractal_dimension_mean 0.417911\n",
"texture_worst 0.322320\n",
"fractal_dimension_sd_error 0.314677\n",
"concave_points_mean 0.233365\n",
"perimeter_sd_error 0.222487\n",
"concave_points_sd_error 0.159417\n",
"symmetry_mean 0.133269\n",
"dtype: float64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# descending list of top 10 feature imporance for logistic regression, using LR coefficients\n",
"fi_model = LogisticRegression(random_state=1)\n",
"fi_model.fit(X_train, y_train)\n",
"\n",
"pd.Series(fi_model.coef_.transpose().reshape(30,),\n",
" index=headerNames[2:]).sort_values(ascending=False).head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create and tune a Random Forest model"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best grid search accuracy of 0.954, n_estimators of 20, sqrt max features\n",
"\n",
"Untuned Model:\n",
"Accuracy against train set, CV: 0.941\n",
"Accuracy against test test: 0.947\n",
"\n",
"Tuned Model:\n",
"Accuracy against train set, CV: 0.954\n",
"Accuracy against test test: 0.904\n"
]
}
],
"source": [
"# define untuned model pipeline\n",
"pipe_rf = Pipeline([('scl', StandardScaler()),\n",
" ('pca', PCA(n_components=15)),\n",
" ('clf', RandomForestClassifier(n_estimators=100))])\n",
"\n",
"# define tuned model pipeline using a grid search\n",
"rf_grid_params = {'clf__n_estimators': [1,5,10,20],\n",
" 'clf__max_features': ['auto', 'sqrt', 'log2']}\n",
"rf_grid_obj = GridSearchCV(estimator=pipe_rf,\n",
" param_grid=rf_grid_params,\n",
" scoring='accuracy',\n",
" cv=10)\n",
"rf_grid_model = rf_grid_obj.fit(X_train, y_train)\n",
"print('Best grid search accuracy of %.3f, n_estimators of %.f, %s max features\\n' \n",
" %(rf_grid_model.best_score_, \n",
" rf_grid_model.best_params_['clf__n_estimators'],\n",
" rf_grid_model.best_params_['clf__max_features']))\n",
"\n",
"# get stats of untuned and tuned model\n",
"print('Untuned Model:')\n",
"get_clf_score(pipe_rf)\n",
"print('')\n",
"print('Tuned Model:')\n",
"get_clf_score(rf_grid_model.best_estimator_)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"concave_points_sd_error 0.151150\n",
"concavity_worst 0.142353\n",
"concave_points_worst 0.129670\n",
"fractal_dimension_mean 0.108413\n",
"perimeter_sd_error 0.076586\n",
"texture_mean 0.050138\n",
"symmetry_worst 0.045562\n",
"perimeter_mean 0.038861\n",
"radius_worst 0.034535\n",
"smoothness_sd_error 0.031145\n",
"dtype: float64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# descending list of top 10 feature imporance for Random Forest, using RF FI method\n",
"fi_model = RandomForestClassifier(n_estimators=100)\n",
"fi_model.fit(X_train, y_train)\n",
"pd.Series(fi_model.feature_importances_, \n",
" index=headerNames[2:]).sort_values(ascending=False).head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explanation of results\n",
"To Technical Audiences:\n",
"\n",
" Further dive into the subject matter and origins of the data with a SME would be in order. From this we would likely open doors for feature engineering and creating simpler, more targeted models rather than using the whole data set. Also, since this is a binary classification problem, more time to look into ROC metrics would likely be a good next step.\n",
"\n",
"To Non-Technical Audiences:\n",
"\n",
" First, the input breast cancer data set was ingested and cleaned, removing any nulls and extraneous fields. Then, all features (smoothness, etc.) were input into two machine learnings models in the effort to predict the target class, diagnosis (malignant or benign). Tuning was performed on both of these models, and the result was 98% accuracy with one model, and 96% with the other. The most important predictive factors for the best performing model were symmetry_worst, symmetry_sd_error, and perimeter_mean."
]
}
],
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment