{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This construction was taken from https://kepler-mapper.scikit-tda.org/generated/gallery/plot_digits.html"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import kmapper as km\n",
"from kmapper import jupyter\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"Breast Cancer\n",
"================\n",
"\n",
"\n",
"\n",
"This example generates a Mapper built from the `Wisconsin Breast Cancer Dataset `_.\n",
"\n",
"`Visualization of the breast cancer mapper <../../_static/breast-cancer.html>`_\n",
"\n",
"\n",
"The reasoning behind the choice of lenses in the demonstration above is:\n",
"\n",
"- **For lens1:** Lenses that make biological sense; in other words, lenses that highlight special features in the data, that I know about. \n",
"- **For lens2:** Lenses that disperse the data, as opposed to clustering many points together.\n",
"\n",
"In the case of this particualr data, using an anomaly score (in this case calculated using the IsolationForest from sklearn) makes biological sense since cancer cells are anomalous. For the second lens, we use the $l^2$ norm.\n",
"\n",
"For an interactive exploration of lens for the breast cancer, see the `Choosing a lens notebook <../../notebooks/Cancer-demo.html>`_.\n",
"\n",
"\n",
"\n",
"![](../../../examples/images/breast-cancer.png)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"import pandas as pd\n",
"import numpy as np\n",
"import kmapper as km\n",
"import sklearn\n",
"from sklearn import ensemble"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"212\n",
"569\n"
]
}
],
"source": [
"# Let us read the data from the Wisconsin Breast Cancer Dataset.\n",
"#It can be found in here: https://www.kaggle.com/uciml/breast-cancer-wisconsin-data\n",
"df = pd.read_csv(\"data\\\\breast-cancer.csv\")\n",
"feature_names = [c for c in df.columns if c not in [\"id\", \"diagnosis\"]]\n",
"df[\"diagnosis\"] = df[\"diagnosis\"].apply(lambda x: 1 if x == \"M\" else 0)\n",
"X = np.array(df[feature_names].fillna(0)) # quick and dirty imputation\n",
"y = np.array(df[\"diagnosis\"])\n",
"\n",
"print(sum(y))\n",
"print(len(y))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\IPython\\core\\display.py:701: UserWarning: Consider using IPython.display.IFrame instead\n",
" warnings.warn(\"Consider using IPython.display.IFrame instead\")\n"
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We create a custom 1-D lens with Isolation Forest\n",
"model = ensemble.IsolationForest(random_state=1729)\n",
"model.fit(X)\n",
"lens1 = model.decision_function(X).reshape((X.shape[0], 1))\n",
"\n",
"# We create another 1-D lens with L2-norm\n",
"mapper = km.KeplerMapper(verbose=0)\n",
"lens2 = mapper.fit_transform(X, projection=\"l2norm\")\n",
"\n",
"# Combine both lenses to create a 2-D [Isolation Forest, L^2-Norm] lens\n",
"lens = np.c_[lens1, lens2]\n",
"\n",
"# Create the simplicial complex\n",
"graph = mapper.map(lens,\n",
" X,\n",
" cover=km.Cover(n_cubes=15, perc_overlap=0.4)\n",
" ,clusterer=sklearn.cluster.KMeans(n_clusters=2,\n",
" random_state=1618033)\n",
" )\n",
"\n",
"# Visualization\n",
"mapper.visualize(graph,\n",
" path_html=\"breast-cancer.html\",\n",
" title=\"Wisconsin Breast Cancer Dataset\",\n",
" custom_tooltips=y)\n",
"\n",
"\n",
"jupyter.display(path_html=\"breast-cancer.html\")"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"