M2_SETI/D3/TP/TP_SETI_SVM/SVM.ipynb

276 lines
89 KiB
Text
Raw Normal View History

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
}