2022-12-29 17:27:20 +01:00
|
|
|
{
|
|
|
|
"cells": [
|
|
|
|
{
|
|
|
|
"attachments": {},
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"# TP 3 SVM\n",
|
|
|
|
"On se propose de faire de la modélisation par SVM sur des problématiques de discrimination, en utilisant la bibliothèque scikit-learn.\n",
|
|
|
|
"\n",
|
|
|
|
"On veut : \n",
|
|
|
|
"- Traiter un problème de discrimination linéairement séparable\n",
|
|
|
|
"- Traiter un problème non linéairement séparable (SVM à noyaux)\n",
|
|
|
|
"- Traiter le problème de la discrimination de chiffres manuscrits"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"attachments": {},
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"## Problème linéairement séparable"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 145,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"import matplotlib.pyplot as plt\n",
|
|
|
|
"import numpy as np\n",
|
|
|
|
"from sklearn.svm import SVC"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 146,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"def genere_ex_1(n1=100, n2=50, mu1=[0,3], mu2=[3,0], sd1=0.15, sd2=0.2):\n",
|
2023-01-12 16:00:39 +01:00
|
|
|
" \"\"\" Génération de point\n",
|
|
|
|
" \"\"\"\n",
|
2022-12-29 17:27:20 +01:00
|
|
|
" X = np.concatenate((np.random.multivariate_normal(mu1, np.diagflat(sd1*np.ones(2)), n1),\n",
|
|
|
|
" np.random.multivariate_normal(mu2, np.diagflat(sd2*np.ones(2)),n2)))\n",
|
|
|
|
"\n",
|
|
|
|
" Y = np.concatenate((np.ones((n1,1)), -1*np.ones((n2,1))))[:,0]\n",
|
|
|
|
" return X,Y"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 147,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"def plot_data_hyperplan(X, Y, classifier, name):\n",
|
2023-01-12 16:00:39 +01:00
|
|
|
" \"\"\" Affichage du classifieur \n",
|
|
|
|
" \"\"\"\n",
|
2022-12-29 17:27:20 +01:00
|
|
|
" w = classifier.coef_[0]\n",
|
|
|
|
" b = classifier.intercept_[0]\n",
|
|
|
|
" a = -w[0] / w[1]\n",
|
|
|
|
" xx = np.linspace(min(X[:,0]), max(X[:,0]))\n",
|
|
|
|
" yy = a * xx - b/w[1]\n",
|
|
|
|
"\n",
|
|
|
|
" color = ['red' if c >= 0 else 'blue' for c in Y]\n",
|
|
|
|
" plt.scatter(X[:,0], X[:,1], color=color)\n",
|
|
|
|
"\n",
|
|
|
|
" plt.plot(xx,yy, color='black')\n",
|
2023-01-12 16:00:39 +01:00
|
|
|
" plt.plot(xx, yy+1/w[1], color='green')\n",
|
|
|
|
" plt.plot(xx, yy-1/w[1], color='green')\n",
|
2022-12-29 17:27:20 +01:00
|
|
|
" plt.xlabel(\"x1\")\n",
|
|
|
|
" plt.ylabel(\"x2\")\n",
|
|
|
|
" plt.title(\"Classe 1 (red), Classe -1 (blue)\")\n",
|
|
|
|
" plt.show()"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 148,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"def main(X,Y):\n",
|
|
|
|
" classifier = SVC(kernel='linear', probability=True)\n",
|
|
|
|
" classifier = classifier.fit(X, Y)\n",
|
|
|
|
"\n",
|
|
|
|
" plot_data_hyperplan(X, Y, classifier, 'Graph_SVM_linear')"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 149,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
"data": {
|
2023-01-29 16:56:40 +01:00
|
|
|
"image/png": "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
|
2022-12-29 17:27:20 +01:00
|
|
|
"text/plain": [
|
2023-01-12 16:00:39 +01:00
|
|
|
"<Figure size 432x288 with 1 Axes>"
|
2022-12-29 17:27:20 +01:00
|
|
|
]
|
|
|
|
},
|
2023-01-12 16:00:39 +01:00
|
|
|
"metadata": {
|
|
|
|
"needs_background": "light"
|
|
|
|
},
|
2022-12-29 17:27:20 +01:00
|
|
|
"output_type": "display_data"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"source": [
|
|
|
|
"X, Y = genere_ex_1() \n",
|
|
|
|
"main(X, Y)\n"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"attachments": {},
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"source": [
|
|
|
|
"## Problème non linéairement séparable\n"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 150,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"from sklearn.model_selection import GridSearchCV"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 151,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"def genere_ex_2(n=300, mu=[0,0], std=0.25, delta=0.2):\n",
|
2023-01-12 16:00:39 +01:00
|
|
|
" \"\"\" Génération de données de nuage gaussien centré en 0 et traversé par une fonction polynomiale de degré 3\n",
|
|
|
|
" \"\"\"\n",
|
2022-12-29 17:27:20 +01:00
|
|
|
" X = np.random.multivariate_normal(mu, np.diagflat(std*np.ones(2)), n)\n",
|
|
|
|
" Y = np.zeros((X.shape[0]))\n",
|
|
|
|
"\n",
|
|
|
|
" for i in range(X.shape[0]):\n",
|
|
|
|
" x = X[i,0]\n",
|
|
|
|
" y = X[i,1]\n",
|
|
|
|
" if y < x*(x-1)*(x+1):\n",
|
|
|
|
" Y[i] = -1\n",
|
|
|
|
" X[i,1] = X[i,1] - delta\n",
|
|
|
|
" else:\n",
|
|
|
|
" Y[i] = 1\n",
|
|
|
|
" X[i,1] = X[i,1] + delta\n",
|
|
|
|
" return X,Y"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 152,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"def plot(X,Y,classifier, nameFig):\n",
|
2023-01-12 16:00:39 +01:00
|
|
|
" \"\"\" Visualisation\n",
|
|
|
|
" \"\"\"\n",
|
2022-12-29 17:27:20 +01:00
|
|
|
" minx1 = min(X[:,0])\n",
|
|
|
|
" maxx1 = max(X[:,0])\n",
|
|
|
|
" minx2 = min(X[:,1])\n",
|
|
|
|
" maxx2 = max(X[:,1])\n",
|
|
|
|
"\n",
|
|
|
|
" xx = np.linspace(minx1, maxx1, 100)\n",
|
|
|
|
" yy = np.linspace(minx2, maxx2, 100).T\n",
|
|
|
|
" xx, yy = np.meshgrid(xx,yy)\n",
|
|
|
|
" Xfull = np.c_[xx.ravel(), yy.ravel()]\n",
|
|
|
|
"\n",
|
|
|
|
" probas = classifier.predict_proba(Xfull)\n",
|
|
|
|
" Z = classifier.decision_function(Xfull)\n",
|
|
|
|
"\n",
|
|
|
|
" k = 1\n",
|
|
|
|
" plt.title(\"Class %d\" %k)\n",
|
|
|
|
" imshow_handle = plt.imshow(probas[:, k].reshape((100,100)), extent=(minx1, maxx1, minx2, maxx2), origin='lower')\n",
|
|
|
|
" \n",
|
|
|
|
" classPos = Y>=0\n",
|
|
|
|
" classNeg = Y<0\n",
|
|
|
|
"\n",
|
|
|
|
" plt.contour(xx, yy, Z.reshape((100,100)), [-1,0,1], colors=['blue', 'black', 'red'])\n",
|
|
|
|
" plt.scatter(X[classPos, 0], X[classPos, 1], marker='o', c='r', edgecolors='k')\n",
|
|
|
|
" plt.scatter(X[classNeg, 0], X[classNeg, 1], marker='o', c='b', edgecolors='k')\n",
|
|
|
|
"\n",
|
|
|
|
" ax = plt.axes([0.8, 0.15, 0.05, 0.7])\n",
|
|
|
|
"\n",
|
|
|
|
" plt.title('Probability')\n",
|
|
|
|
" plt.colorbar(imshow_handle, cax=ax, orientation='vertical')\n",
|
|
|
|
" \n",
|
|
|
|
" plt.savefig(nameFig+'.jpg', dpi=300)\n",
|
|
|
|
" plt.show()\n",
|
|
|
|
" plt.close()"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 153,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [],
|
|
|
|
"source": [
|
|
|
|
"def main(X,Y,nameFig = 'GridSearchCV'):\n",
|
2023-01-12 16:00:39 +01:00
|
|
|
" \"\"\" Création du modèle avec la recherche du meilleur paramétrage de GridSearchCV \n",
|
|
|
|
" \"\"\"\n",
|
2022-12-29 17:27:20 +01:00
|
|
|
" parameters = {'kernel':('poly', 'poly'), 'C':[0.1,0.5, 1, 10], 'degree':[3,5], 'coef0':[0, 0.1, 0.5, 1, 10]}\n",
|
|
|
|
" svc = SVC(probability=True)\n",
|
|
|
|
" classifier = GridSearchCV(svc, parameters)\n",
|
|
|
|
" classifier = classifier.fit(X,Y)\n",
|
|
|
|
" print(classifier.best_params_)\n",
|
|
|
|
"\n",
|
|
|
|
" plot(X,Y, classifier=classifier, nameFig=nameFig)"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"cell_type": "code",
|
2023-01-29 16:56:40 +01:00
|
|
|
"execution_count": 154,
|
2022-12-29 17:27:20 +01:00
|
|
|
"metadata": {},
|
|
|
|
"outputs": [
|
|
|
|
{
|
|
|
|
"name": "stdout",
|
|
|
|
"output_type": "stream",
|
|
|
|
"text": [
|
2023-01-29 16:56:40 +01:00
|
|
|
"{'C': 1, 'coef0': 0.5, 'degree': 3, 'kernel': 'poly'}\n"
|
2022-12-29 17:27:20 +01:00
|
|
|
]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"data": {
|
2023-01-29 16:56:40 +01:00
|
|
|
"image/png": "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
|
2022-12-29 17:27:20 +01:00
|
|
|
"text/plain": [
|
2023-01-12 16:00:39 +01:00
|
|
|
"<Figure size 432x288 with 2 Axes>"
|
2022-12-29 17:27:20 +01:00
|
|
|
]
|
|
|
|
},
|
2023-01-12 16:00:39 +01:00
|
|
|
"metadata": {
|
|
|
|
"needs_background": "light"
|
|
|
|
},
|
2022-12-29 17:27:20 +01:00
|
|
|
"output_type": "display_data"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"source": [
|
|
|
|
"X,Y = genere_ex_2()\n",
|
|
|
|
"main(X,Y)"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"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",
|
2023-01-29 16:56:40 +01:00
|
|
|
"version": "3.9.4 (tags/v3.9.4:1f2e308, Apr 6 2021, 13:40:21) [MSC v.1928 64 bit (AMD64)]"
|
2022-12-29 17:27:20 +01:00
|
|
|
},
|
|
|
|
"orig_nbformat": 4,
|
|
|
|
"vscode": {
|
|
|
|
"interpreter": {
|
2023-01-12 16:00:39 +01:00
|
|
|
"hash": "2ef431f6525756fa8a44688585fa332ef3b2e5fcfe8fe75df35bbf7028a8b511"
|
2022-12-29 17:27:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"nbformat": 4,
|
|
|
|
"nbformat_minor": 2
|
|
|
|
}
|