{ "cells": [ { "cell_type": "markdown", "id": "498d70fa", "metadata": {}, "source": [ "**实验三:逻辑回归**" ] }, { "cell_type": "markdown", "id": "fa5c5483", "metadata": {}, "source": [ "**第一部分:函数介绍**" ] }, { "cell_type": "markdown", "id": "869f21ce", "metadata": {}, "source": [ "由于机器学习所使用的数据集并不一定能够直接进行使用,如经常可能出现缺失值或者异常值(如异常0或者异常大的数据),又或者是数据类型不适合直接应用于模型训练等,所以数据预处理同样是机器学习过程中十分重要的一个部分。 \n", " 本次实验的数据预处理需要用的操作包括判断数据是否有缺失值以及异常值、缺失值替换操作、并将部分特征值类型转换为适合模型训练的类型。在进行逻辑回归实验之前,首先介绍下上述操作所用到的python语法。" ] }, { "cell_type": "markdown", "id": "3957a94a", "metadata": {}, "source": [ "1) 判断一列中是否有缺失值" ] }, { "cell_type": "code", "execution_count": 2, "id": "5472add3", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import math\n", "import matplotlib as mpl\n", "# ignore warnings\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 3, "id": "dc6837f2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "height 2\n", "weight 2\n", "sex 0\n", "dtype: int64\n", " height weight sex\n", "0 170.0 54.0 Male\n", "1 180.0 NaN Male\n", "2 164.0 48.0 Female\n", "3 NaN 66.0 Male\n", "4 176.0 NaN Female\n", "5 162.0 59.0 Male\n", "6 154.0 46.0 Male\n", "7 155.0 58.0 Female\n", "8 165.0 0.0 Female\n", "9 NaN 50.0 Female\n" ] } ], "source": [ "#通过pandas将csv文件转换为dataframe格式后进行操作\n", "train1_frame = pd.read_csv('introduction.csv')\n", "#判断每一列是否有空值并返回每列空值的数量\n", "print(train1_frame.isnull().sum())\n", "print(train1_frame)" ] }, { "cell_type": "markdown", "id": "75d469ff", "metadata": {}, "source": [ "2) 对每一列的缺失值和异常值进行替换操作" ] }, { "cell_type": "code", "execution_count": 4, "id": "891fed76", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " height weight sex\n", "0 170.0 54.0 Male\n", "1 180.0 NaN Male\n", "2 164.0 48.0 Female\n", "3 NaN 66.0 Male\n", "4 176.0 NaN Female\n", "5 162.0 59.0 Male\n", "6 154.0 46.0 Male\n", "7 155.0 58.0 Female\n", "8 165.0 NaN Female\n", "9 NaN 50.0 Female\n" ] } ], "source": [ "#将0替换为空值,之后将空值替换为修正的值(例如:平均值、中数、众数等)\n", "#利用pandas中的replace函数将某一列的指定值替换为另一个值\n", "train1_frame[['height','weight']]=\\\n", "train1_frame[['height','weight']].replace(0,np.NaN)\n", "print(train1_frame)" ] }, { "cell_type": "code", "execution_count": 5, "id": "1aec2a23", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " height weight sex\n", "0 170.0 54.0 Male\n", "1 180.0 NaN Male\n", "2 164.0 48.0 Female\n", "3 165.0 66.0 Male\n", "4 176.0 NaN Female\n", "5 162.0 59.0 Male\n", "6 154.0 46.0 Male\n", "7 155.0 58.0 Female\n", "8 165.0 NaN Female\n", "9 166.5 50.0 Female\n" ] } ], "source": [ "#先对height列进行分离,之后将temp按照性别进行分类,之后使用mean函数分别计算male和female非空数据的height的平均值\n", "temp=train1_frame[train1_frame['height'].notnull()]\n", "temp=temp[['height','sex']].groupby(['sex'])[['height']].mean().reset_index()\n", "\n", "#使用dataframe的loc函数将指定条件的height列和sex列筛选出来进行值替换操作\n", "train1_frame.loc[(train1_frame['sex']=='Male')&(train1_frame['height'].isnull()),'height']=temp['height'][0]\n", "train1_frame.loc[(train1_frame['sex']=='Female')&(train1_frame['height'].isnull()),'height']=temp['height'][1]\n", "print(train1_frame)" ] }, { "cell_type": "code", "execution_count": 6, "id": "4f394062", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " height weight sex\n", "0 170.0 54.0 Male\n", "1 180.0 50.0 Male\n", "2 164.0 48.0 Female\n", "3 165.0 66.0 Male\n", "4 176.0 56.5 Female\n", "5 162.0 59.0 Male\n", "6 154.0 46.0 Male\n", "7 155.0 58.0 Female\n", "8 165.0 56.5 Female\n", "9 166.5 50.0 Female\n" ] } ], "source": [ "#再对weight列进行分离,之后同样将temp按照性别进行分类,之后使用median函数分别计算male和female非空数据的height的中位数\n", "temp=train1_frame[train1_frame['weight'].notnull()]\n", "temp=temp[['weight','sex']].groupby(['sex'])[['weight']].median().reset_index()\n", "\n", "#使用dataframe的loc函数将指定条件的height列和sex列筛选出来进行值替换操作\n", "train1_frame.loc[(train1_frame['sex']=='Male')&(train1_frame['weight'].isnull()),'weight']=temp['weight'][0]\n", "train1_frame.loc[(train1_frame['sex']=='Female')&(train1_frame['weight'].isnull()),'weight']=temp['weight'][1]\n", "print(train1_frame)" ] }, { "cell_type": "markdown", "id": "d0ea36f6", "metadata": {}, "source": [ "3) 将结果值从字符串变成容易操作的整数类型" ] }, { "cell_type": "code", "execution_count": 7, "id": "8341000e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " height weight sex\n", "0 170.0 54.0 Male\n", "1 180.0 50.0 Male\n", "2 164.0 48.0 Female\n", "3 165.0 66.0 Male\n", "4 176.0 56.5 Female\n", "5 162.0 59.0 Male\n", "6 154.0 46.0 Male\n", "7 155.0 58.0 Female\n", "8 165.0 56.5 Female\n", "9 166.5 50.0 Female\n", " height weight sex\n", "0 170.0 54.0 0\n", "1 180.0 50.0 0\n", "2 164.0 48.0 1\n", "3 165.0 66.0 0\n", "4 176.0 56.5 1\n", "5 162.0 59.0 0\n", "6 154.0 46.0 0\n", "7 155.0 58.0 1\n", "8 165.0 56.5 1\n", "9 166.5 50.0 1\n" ] } ], "source": [ "print(train1_frame)\n", "train1_frame['sex'] = np.where(train1_frame['sex'] == \"Male\", 0, 1)\n", "print(train1_frame)" ] }, { "cell_type": "markdown", "id": "ac00368d", "metadata": {}, "source": [ "4) 当坐标为两维时的绘图" ] }, { "cell_type": "code", "execution_count": 8, "id": "f4314e6f", "metadata": {}, "outputs": [ { "data": { "image/png": "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/e53x/2d1atXx6pVq972/d+vW1bJRwMAAAV16NCh2kXLSy+9FEeOHIlJkyYN+P6kSZNiz549x/2drq6u6OjoSL7+97//He9///vjueeeO+FgMFwHDx6MadOmxd69e2PcuHFpj0OB+VujUfyt0Sj+1miU/v7+OHToUEyZMuWEP1f37WFNTU3R1NT0tu+PHz/e/xLQEOPGjfO3RkP4W6NR/K3RKP7WaIShPMio6CL+e9/73hg1alTs27dvwPf37dsXkye7UA8AANReRdEyevToOO+882Lr1q3J9/r6+mLr1q3R1tZW8+EAAAAqPh7W0dERy5Yti1mzZsUFF1wQd955Zxw+fDiuvPLKIf1+U1NT3Hjjjcc9Mga15G+NRvG3RqP4W6NR/K2RNRWvPI6IWLt2bdxxxx3x4osvRmtra9x1110xe/bseswHAACUXFXRAgAA0CgV3WkBAABoNNECAABkmmgBAAAyTbQAAACZ1tBoufvuu+P000+P5ubmmD17djz++OON/HhKYPXq1XH++efH2LFjY+LEibF48eJ45pln0h6LErj11ltjxIgRsWLFirRHoaD+8Y9/xGc/+9k47bTTYsyYMXHWWWfFH/7wh7THomCOHDkSN9xwQ8yYMSPGjBkTH/jAB+KrX/1q2NtE2hoWLZs2bYqOjo648cYbY9euXXH22WfHJZdcEvv372/UCJTAo48+GsuXL4/HHnssHn744Xj99dfj4osvjsOHD6c9GgW2Y8eOWL9+fbS0tKQ9CgX1r3/9K+bOnRvvfOc742c/+1n88Y9/jK997Wvxnve8J+3RKJjbbrst1q1bF2vXro0//elPcdttt8Xtt98e3/zmN9MejZJr2Mrj2bNnx/nnnx9r166NiIi+vr6YNm1aXHPNNdHZ2dmIESihf/7znzFx4sR49NFH46KLLkp7HAro5ZdfjnPPPTe+9a1vxU033RStra1x5513pj0WBdPZ2Rm/+c1v4le/+lXao1BwH//4x2PSpEnx3e9+N/neJz/5yRgzZkx8//vfT3Eyyq4hT1pee+212LlzZyxYsOC/HzxyZCxYsCB+97vfNWIESurAgQMREXHqqaemPAlFtXz58li0aNGA//sGtfbggw/GrFmz4lOf+lRMnDgxzjnnnLj33nvTHosCmjNnTmzdujWeffbZiIh46qmn4te//nW0t7enPBll945GfMhLL70UR44ciUmTJg34/qRJk2LPnj2NGIES6uvrixUrVsTcuXNj5syZaY9DAT3wwAOxa9eu2LFjR9qjUHB//etfY926ddHR0RHd3d2xY8eOuPbaa2P06NGxbNmytMejQDo7O+PgwYPxoQ99KEaNGhVHjhyJm2++OS6//PK0R6PkGhItkIbly5fH008/Hb/+9a/THoUC2rt3b1x33XXx8MMPR3Nzc9rjUHB9fX0xa9asuOWWWyIi4pxzzomnn346vv3tb4sWauqHP/xh/OAHP4iNGzfGmWeeGU8++WSsWLEipkyZ4m+NVDUkWt773vfGqFGjYt++fQO+v2/fvpg8eXIjRqBkrr766njooYdi+/btMXXq1LTHoYB27twZ+/fvj3PPPTf53pEjR2L79u2xdu3a6OnpiVGjRqU4IUXyvve9Lz7ykY8M+N6HP/zh2Lx5c0oTUVRf+tKXorOzMz796U9HRMRZZ50Vf//732P16tWihVQ15E7L6NGj47zzzoutW7cm3+vr64utW7dGW1tbI0agJPr7++Pqq6+OLVu2xC9/+cuYMWNG2iNRUB/96Edj9+7d8eSTTyb/zJo1Ky6//PJ48sknBQs1NXfu3Letb3/22Wfj/e9/f0oTUVSvvPJKjBw58P89HDVqVPT19aU0ERzVsONhHR0dsWzZspg1a1ZccMEFceedd8bhw4fjyiuvbNQIlMDy5ctj48aN8dOf/jTGjh0bL774YkREjB8/PsaMGZPydBTJ2LFj33ZX6pRTTonTTjvNHSpq7otf/GLMmTMnbrnllrjsssvi8ccfj3vuuSfuueeetEejYC699NK4+eabY/r06XHmmWfGE088EV//+tfj85//fNqjUXINW3kcEbF27dq444474sUXX4zW1ta46667Yvbs2Y36eEpgxIgRx/3+9773vfjc5z7X2GEonXnz5ll5TN089NBD0dXVFX/+859jxowZ0dHREV/4whfSHouCOXToUNxwww2xZcuW2L9/f0yZMiU+85nPxFe+8pUYPXp02uNRYg2NFgAAgEo15E4LAABAtUQLAACQaaIFAADINNECAABkmmgBAAAyTbQAAACZJloAAIBMEy0AAECmiRYAACDTRAsAAJBpogUAAMi0/w9bVtVKFE/hBAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#确定图画边界和大小\n", "plt.figure(figsize=(10,5))\n", "x_min, x_max = 0,10\n", "y_min, y_max = 0,5\n", "#使用numpy中的meshgrid生成网格矩阵,方便进行之后的描点\n", "boundary_x, boundary_y = np.meshgrid(np.arange(x_min, x_max, 0.01),np.arange(y_min, y_max, 0.01))\n", "grid = np.c_[boundary_x.ravel(), boundary_y.ravel()]\n", "#加入偏置对应的一列\n", "e=np.ones((len(grid),1))\n", "grid=np.c_[e,grid]\n", "#假定下列的模型参数\n", "w=np.array([[0],[3],[-6]])\n", "#计算出网格点中每个点对应的逻辑回归预测值\n", "z=grid.dot(w)\n", "for i in range(len(z)):\n", " z[i][0]=(1/(1+np.exp(-z[i])))\n", " if(z[i][0]<0.5):z[i][0]=0\n", " else:z[i][0]=1\n", "#转换shape以作出决策边界\n", "z=z.reshape(boundary_x.shape)\n", "plt.contourf(boundary_x, boundary_y, z, cmap=plt.cm.Spectral, zorder=1)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "id": "8c07701a", "metadata": {}, "outputs": [ { "data": { "image/png": "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oKAgjRkzRp988okk6dKlS1q7dq3GjBmjnj17ym63a968eTpz5kyTbW7cuFEWi8VriYmJubEjAgAAnU6AP5W//fZbTZ48WXfddZf279+vsLAwFRYWqm/fvpKkCxcu6NNPP9X69et122236dtvv9WyZct0zz33eEJNY0aNGqWDBw/+2LEAv7oGAAA6Mb9SwbPPPiuHw6E33njDUxYdHe35d0hIiD766COvfV566SX90z/9k0pLS3XLLbc03pGAAEVERPjTHQAAcJPw65ZQZmamJkyYoPvuu08DBgzQ7bffrh07djS5T21trSwWi/r06dNkvcLCQtntdg0ePFhpaWkqLS1ttK7L5ZLT6fRaAABA5+VXYDl58qReeeUV3Xrrrfrwww+1ePFiLV26VLt27fJZ/+LFi1q7dq1SU1MVHBzcaLuxsbF68803deDAAb3yyis6deqU4uLidO7cOZ/1t2zZopCQEM/icDj8OQwAANDBWAzDMK63crdu3TRhwgQdPXrUU7Z06VIdO3ZMOTk5XnUvXbqkWbNmqaysTIcOHWoysFytpqZGUVFR2rZtmxYsWNBgu8vlksvl8qw7nU45HA7V1tb69XMAAED7cTqdCgkJua6/335dYbHZbBo5cqRX2YgRIxrcvrl06ZLuv/9+/f3vf9dHH33kd4jo06ePhg0bpqKiIp/bAwMDFRwc7LUAAIDOy6/AMnnyZBUUFHiVffXVV4qKivKsXwkrhYWFOnjwoEJDQ/3uVF1dnYqLi2Wz2fzeFwAAdD5+BZYVK1YoNzdXTz/9tIqKirR792699tprWrJkiSR3WJk9e7Y++eQTvf3226qvr1dlZaUqKyv1/fffe9qJj4/XSy+95FlftWqVDh8+rJKSEh09elQzZ86U1WpVampqCx0mAADoyPx6rXnixInat2+f1q1bpyeffFLR0dFKT09XWlqaJPekcpmZmZKkcePGee378ccfa9q0aZKk4uJinT171rOtrKxMqampqq6uVlhYmKZMmaLc3FyFhYU149AAAEBn4ddDt2blz0M7AADAHFrtoVsAAID2QGABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACmR2ABAACm53dgKS8v19y5cxUaGqqgoCCNGTNGn3zyiWe7YRjasGGDbDabgoKClJCQoMLCwmu2+/LLL2vQoEHq3r27YmNj9be//c3frgEAgE7Kr8Dy7bffavLkyeratav279+vL774Qs8//7z69u3rqbN161a9+OKL2r59u/Ly8tSzZ08lJibq4sWLjbb77rvvauXKlfrd736nTz/9VLfddpsSExP19ddf3/iRAQCATsNiGIZxvZV/+9vf6n/+53+UnZ3tc7thGLLb7Xrssce0atUqSVJtba3Cw8P15ptvas6cOT73i42N1cSJE/XSSy9Jki5fviyHw6FHH31Uv/3tb6/ZL6fTqZCQENXW1io4OPh6DwcAALQjf/5++3WFJTMzUxMmTNB9992nAQMG6Pbbb9eOHTs820+dOqXKykolJCR4ykJCQhQbG6ucnByfbX7//ffKz8/32qdLly5KSEhodB+XyyWn0+m1AACAzsuvwHLy5Em98soruvXWW/Xhhx9q8eLFWrp0qXbt2iVJqqyslCSFh4d77RceHu7ZdrWzZ8+qvr7er322bNmikJAQz+JwOPw5DAAA0MH4FVguX76sO+64Q08//bRuv/12LVq0SAsXLtT27dtbq38+rVu3TrW1tZ7l9OnTbfrzAQBA2/IrsNhsNo0cOdKrbMSIESotLZUkRURESJKqqqq86lRVVXm2Xa1///6yWq1+7RMYGKjg4GCvBQAAdF5+BZbJkyeroKDAq+yrr75SVFSUJCk6OloRERHKysrybHc6ncrLy9OkSZN8ttmtWzeNHz/ea5/Lly8rKyur0X0AAMDNxa/AsmLFCuXm5urpp59WUVGRdu/erddee01LliyRJFksFi1fvlybN29WZmamPvvsM82bN092u1333nuvp534+HjPG0GStHLlSu3YsUO7du3Sl19+qcWLF+v8+fN66KGHWuYoAQBAhxbgT+WJEydq3759WrdunZ588klFR0crPT1daWlpnjpr1qzR+fPntWjRItXU1GjKlCk6cOCAunfv7qlTXFyss2fPetYfeOAB/eMf/9CGDRtUWVmpcePG6cCBAw0exAUAADcnv+ZhMSvmYQEAoONp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2sGVv9uGYVyzrt+B5Z133tGnn36qY8eO+dz+4IMPKioqSna7XSdOnNDatWtVUFCgjIwMn/UrKyslSeHh4V7l4eHhnm1X27JlizZt2tSg3OFw+HMoAADABM6dO6eQkJAm6/gVWE6fPq1ly5bpo48+Uvfu3X3WWbRokeffY8aMkc1mU3x8vIqLizVkyBB/flyj1q1bp5UrV3rWL1++rG+++UahoaGyWCwt8jNaktPplMPh0OnTp5u8PQb/Mbath7FtPYxt62BcW09rja1hGDp37pzsdvs16/oVWPLz8/X111/rjjvu8JTV19fryJEjeumll+RyuWS96tuMY2NjJUlFRUU+A0tERIQkqaqqSjabzVNeVVWlcePG+exHYGCgAgMDvcr69Onjz6G0i+DgYH6JWglj23oY29bD2LYOxrX1tMbYXuvKyhV+PXQbHx+vzz77TMePH/csEyZMUFpamo4fP94grEjS8ePHJckrjPxUdHS0IiIilJWV5SlzOp3Ky8vTpEmT/OkeAADopPy6wtK7d2+NHj3aq6xnz54KDQ3V6NGjVVxcrN27d+sXv/iFQkNDdeLECa1YsUJTp071ev05JiZGW7Zs0cyZMz3zuGzevFm33nqroqOjtX79etntdt17770tcpAAAKBju6G3hBrTrVs3HTx4UOnp6Tp//rwcDodmzZqlJ554wqteQUGB580eSVqzZo3Onz+vRYsWqaamRlOmTNGBAwcafU6mowkMDNTvfve7Brex0HyMbethbFsPY9s6GNfWY4axtRjX8y4RAABAO+K7hAAAgOkRWAAAgOkRWAAAgOkRWAAAgOkRWJrhyJEjuvvuu2W322WxWBp8WeP8+fNlsVi8lqSkJK86gwYNalDnmWeeacOjMJ9rjaskffnll7rnnnsUEhKinj17auLEiSotLfVsv3jxopYsWaLQ0FD16tVLs2bNUlVVVRsehTm1xNhOmzatwWf24YcfbsOjMKdrje3VY3Zlee655zx1vvnmG6WlpSk4OFh9+vTRggULVFdX18ZHYj4tMbacaxu61rjW1dXpkUceUWRkpIKCgjRy5Eht377dq05bnmsJLM1w/vx53XbbbXr55ZcbrZOUlKSKigrP8u///u8N6jz55JNedR599NHW7LbpXWtci4uLNWXKFMXExOjQoUM6ceKE1q9f7/Ua/IoVK/T+++9rz549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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"\n", "可使用plt.scatter来绘制出测试集的每个样本点,并设置指定颜色来区分预测正确和错误的样本\n", "plt.scatter(x,y,c=\"color\"),x、y为坐标值,c为指定颜色\n", "\"\"\"\n", "class_1=train1_frame[train1_frame['sex']==1]\n", "class_0=train1_frame[train1_frame['sex']==0]\n", "plt.scatter(class_1['height'],class_1['weight'],c='blue')\n", "plt.scatter(class_0['height'],class_0['weight'],c='red')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "657beb0c", "metadata": {}, "source": [ "**第二部分:逻辑回归实验一**" ] }, { "cell_type": "code", "execution_count": 10, "id": "226badd7", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import math\n", "import matplotlib as mpl" ] }, { "cell_type": "markdown", "id": "7a0bdb6f", "metadata": {}, "source": [ "Iris数据集是常用的分类实验数据集,也称鸢尾花卉数据集,是一类多重变量分析的数据集。我们实验选取数据集的部分内容,包含训练集中的80个数据样本和测试集的20个样本,分为2类,每个数据包含2个属性。可通过花萼长度(x1),花萼宽度(x2)2个属性预测鸢尾花卉属于(Setosa,Versicolour)二个种类中的哪一类。" ] }, { "cell_type": "markdown", "id": "70d2906a", "metadata": {}, "source": [ "1) 使用pandas库将训练数据集'flower_train.csv'与测试数据集'flower_test.csv'载入到Dataframe对象中,并判断训练集中每列数据是否有缺失值或者不合理的数值,如果有,请在不删除数据的前提下进行处理,而测试集为完好的数据集,不需要进行操作。由于花卉类型(type)为字符串类型,请将花卉类型转换为适合模型训练的类型" ] }, { "cell_type": "code", "execution_count": 11, "id": "f59640f4", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "x1", "rawType": "float64", "type": "float" }, { "name": "x2", "rawType": "float64", "type": "float" }, { "name": "type", "rawType": "int64", "type": "integer" } ], "ref": "f69511a5-6753-4473-888d-438cb3170f12", "rows": [ [ "0", "5.032432432432432", "3.4432432432432436", "0" ], [ "1", "5.032432432432432", "3.4432432432432436", "0" ], [ "2", "5.032432432432432", "3.4432432432432436", "0" ], [ "3", "5.032432432432432", "3.4432432432432436", "0" ], [ "4", "5.032432432432432", "3.4432432432432436", "0" ], [ "5", "5.032432432432432", "3.4432432432432436", "0" ], [ "6", "5.032432432432432", "3.4432432432432436", "0" ], [ "7", "5.032432432432432", "3.4432432432432436", "0" ], [ "8", "5.032432432432432", "3.4432432432432436", "0" ], [ "9", "5.032432432432432", "3.4432432432432436", "0" ], [ "10", "5.032432432432432", "3.4432432432432436", "0" ], [ "11", "5.032432432432432", "3.4432432432432436", "0" ], [ "12", "5.032432432432432", "3.4432432432432436", "0" ], [ "13", "5.032432432432432", "3.4432432432432436", "0" ], [ "14", "5.032432432432432", "3.4432432432432436", "0" ], [ "15", "5.032432432432432", "3.4432432432432436", "0" ], [ "16", "5.032432432432432", "3.4432432432432436", "0" ], [ "17", "5.032432432432432", "3.4432432432432436", "0" ], [ "18", "5.032432432432432", "3.4432432432432436", "0" ], [ "19", "5.032432432432432", "3.4432432432432436", "0" ], [ "20", "5.032432432432432", "3.4432432432432436", "0" ], [ "21", "5.032432432432432", "3.4432432432432436", "0" ], [ "22", "5.032432432432432", "3.4432432432432436", "0" ], [ "23", "5.032432432432432", "3.4432432432432436", "0" ], [ "24", "5.032432432432432", "3.4432432432432436", "0" ], [ "25", "5.032432432432432", "3.4432432432432436", "0" ], [ "26", "5.032432432432432", "3.4432432432432436", "0" ], [ "27", "5.032432432432432", "3.4432432432432436", "0" ], [ "28", "5.032432432432432", "3.4432432432432436", "0" ], [ "29", "5.032432432432432", "3.4432432432432436", "0" ], [ "30", "5.032432432432432", "3.4432432432432436", "0" ], [ "31", "5.032432432432432", "3.4432432432432436", "0" ], [ "32", "5.032432432432432", "3.4432432432432436", "0" ], [ "33", "5.032432432432432", "3.4432432432432436", "0" ], [ "34", "5.032432432432432", "3.4432432432432436", "0" ], [ "35", "5.032432432432432", "3.4432432432432436", "0" ], [ "36", "5.032432432432432", "3.4432432432432436", "0" ], [ "37", "5.032432432432432", "3.4432432432432436", "0" ], [ "38", "5.032432432432432", "3.4432432432432436", "0" ], [ "39", "5.032432432432432", "3.4432432432432436", "0" ], [ "40", "5.913157894736842", "2.7486486486486488", "1" ], [ "41", "5.913157894736842", "2.7486486486486488", "1" ], [ "42", "5.913157894736842", "2.7486486486486488", "1" ], [ "43", "5.913157894736842", "2.7486486486486488", "1" ], [ "44", "5.913157894736842", "2.7486486486486488", "1" ], [ "45", "5.913157894736842", "2.7486486486486488", "1" ], [ "46", "5.913157894736842", "2.7486486486486488", "1" ], [ "47", "5.913157894736842", "2.7486486486486488", "1" ], [ "48", "5.913157894736842", "2.7486486486486488", "1" ], [ "49", "5.913157894736842", "2.7486486486486488", "1" ] ], "shape": { "columns": 3, "rows": 80 } }, "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", " \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", "
x1x2type
05.0324323.4432430
15.0324323.4432430
25.0324323.4432430
35.0324323.4432430
45.0324323.4432430
............
755.9131582.7486491
765.9131582.7486491
775.9131582.7486491
785.9131582.7486491
795.9131582.7486491
\n", "

80 rows × 3 columns

\n", "
" ], "text/plain": [ " x1 x2 type\n", "0 5.032432 3.443243 0\n", "1 5.032432 3.443243 0\n", "2 5.032432 3.443243 0\n", "3 5.032432 3.443243 0\n", "4 5.032432 3.443243 0\n", ".. ... ... ...\n", "75 5.913158 2.748649 1\n", "76 5.913158 2.748649 1\n", "77 5.913158 2.748649 1\n", "78 5.913158 2.748649 1\n", "79 5.913158 2.748649 1\n", "\n", "[80 rows x 3 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#your code here------\n", "file_flower_test = pd.read_csv(\"flower_test.csv\")\n", "file_flower_train = pd.read_csv(\"flower_train.csv\")\n", "df_test = pd.DataFrame(file_flower_test)\n", "df_train = pd.DataFrame(file_flower_train)\n", "df_test.isnull().sum() # 0个空值\n", "df_train.isnull().sum() #11个空值\n", "df_train = df_train.replace(\"Iris-setosa\", 0)\n", "df_train = df_train.replace(\"Iris-versicolor\", 1)\n", "df_data = df_train.groupby('type').mean() # 按照species分组,计算每组的平均值\n", "df_train.loc[df_train['type'] == 0, 'x1'] = df_data.loc[0, 'x1'] \n", "df_train.loc[df_train['type'] == 1, 'x1'] = df_data.loc[1, 'x1']\n", "df_train.loc[df_train['type'] == 0, 'x2'] = df_data.loc[0, 'x2'] \n", "df_train.loc[df_train['type'] == 1, 'x2'] = df_data.loc[1, 'x2']\n", "df_train.isnull().sum() # 0个空值\n", "df_train" ] }, { "cell_type": "markdown", "id": "75b2fd55", "metadata": {}, "source": [ "2)在之前的线性回归实验中,我们的模型为$\\hat{y}=\\omega^T x+b$,为方便实验,该实验中我们将偏置量b划入模型参数中,则对应的模型变为$\\hat{y}=\\omega^Tx$,请进行相应的转换 \n", "tips:上一次实验中的矩阵求解析解的方法中将某一列全设置为1,即将偏置量b算入模型参数中,特征值中加入一列全1的特征量" ] }, { "cell_type": "code", "execution_count": 12, "id": "6c2c4001", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(80, 1)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#your code here------\n", "X = np.hstack((np.ones((len(df_train), 1)), df_train[['x1', 'x2']]))\n", "Y = np.array(df_train['type'].values).reshape(-1, 1)\n", "Y.shape" ] }, { "cell_type": "markdown", "id": "fec5c2ed", "metadata": {}, "source": [ "3) 由于逻辑回归的原理是用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1)所以逻辑回归适合于二分类问题。我们使用sigmoid函数$g(z)=\\frac{1}{1+e^{-z}}$将把线性回归的结果从(-∞,∞)映射到(0,1)。 \n", " 假设模型为线性回归模型$\\hat{y}=\\omega_0+\\omega_1 x_1+\\omega_2 x_2+...+\\omega_n x_n=\\omega^T x$,则任意样本所对应发生的概率值函数即为$g(\\hat{y})=\\frac{1}{1+e^{-\\hat{y}}}$,这样事情发生(定义为标签为1)的概率为$$P(y=1|x)=\\frac{1}{1+e^{-\\omega^T x}}$$ \n", " 对应于任意一个样本(${x_i}$,$y_i$),其中$x_i$为特征值,$y_i$为实际结果值,在参数$\\omega$下,该样本发生的概率为$$P(y_i|x_i,\\omega)=y_i{P(y_i=1|x_i)}+({1-y_i}){P(y_i=0|x_i)}$$\n", " 将每个样本发生概率相乘,得到似然函数:$$\\Pi^m_{i=1}{P(y_i|x_i,\\omega)}$$\n", " 为了计算方便,一般取对数得到对数似然函数:$$L(\\omega)=\\sum^m_{i=1}{lnP(y_i|x_i,\\omega)}$$ \n", " 我们总是希望出现预测正确的概率的可能性最大,即想要得到极大化似然函数对应的参数$\\omega$。这样最大化似然函数就转变为最小化似然函数的负数,取负的平均对数似然函数为损失函数,通过这样构建的损失函数$$J(\\omega)=-\\frac{1}{m}\\sum^m_{i=1}{lnP(y_i|x_i,\\omega)}=-\\frac{1}{m}\\sum^m_{i=1}ln(y_i\\frac{1}{1+e^{-\\omega^T x_i}}+(1-y_i)\\frac{e^{-\\omega^T x_i}}{1+e^{-\\omega^T x_i}})$$ \n", " 手动实现梯度下降法(不使用机器学习框架,如PyTorch、TensorFlow等)来进行模型的训练。 " ] }, { "cell_type": "markdown", "id": "f1a81c73", "metadata": {}, "source": [ "算法步骤如下:①初始化模型参数$\\omega$的值;②在负梯度的方向上更新参数(由于该实验涉及样本数量较小,建议使用批量梯度下降),并不断迭代这一步骤。" ] }, { "cell_type": "markdown", "id": "4e922340", "metadata": {}, "source": [ "其中梯度的下降偏导公式为\n", " $$\\frac{\\partial J}{\\partial \\omega_j}=\\frac{1}{m}\\sum_{i=1}^m x_{ij}(\\frac{e^{\\omega^T x_i}}{1+e^{\\omega^T x_i}}-y_i)$$ \n", " 参数更新的公式为$$\\omega_j =\\omega_j-\\eta\\frac{\\partial J}{\\partial w_j}$$其中$\\eta$表示学习率,$m$则表示批量中的样本数量,$x_{ij}$代表着第i个样本的第j个特征值,$y_i$代表着第i个样本的真实值" ] }, { "cell_type": "code", "execution_count": 13, "id": "8a92473b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, '损失')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGtCAYAAADuyIUrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBFElEQVR4nO3deXxU9b3/8fdMJpkkZIOEgCEhQUBirIhUQUUTiFZxodemRdRaqbY3guVnXWqFFncQF9RbKxf3KletllJUFNSgoKIsNogapeyQECSLIZOQdZbz+2MyQ0ICRpmZk+X1fDzOY2a+8z3nfOdozbuf8z3nWAzDMAQAANDNWc0eAAAAQCAQagAAQI9AqAEAAD0CoQYAAPQIhBoAANAjEGoAAECPQKgBAAA9gs3sAYSSx+PRvn37FBsbK4vFYvZwAABAJxiGodraWqWkpMhqPXI9pleFmn379iktLc3sYQAAgB+gpKREqampR/y+V4Wa2NhYSd6DEhcXZ/JoAABAZ9TU1CgtLc3/d/xIelWo8Z1yiouLI9QAANDNfNfUESYKAwCAHoFQAwAAegRCDQAA6BEINQAAoEcg1AAAgB6BUAMAAHoEQg0AAOgRCDUAAKBHINQAAIAegVADAAB6BEINAADoEUwNNXV1dcrPz1d6erpSU1M1efJklZWVddh39uzZGjZsWJslISFBP/vZz0I8agAA0BWZGmqmT58ui8WiHTt2qLi4WKNHj9bEiRPldDrb9Z0zZ462b9/uX95//30NHDhQjzzyiAkjb8vjMdTQ7JbL7TF7KAAA9FqmhZpt27ZpyZIlmj9/vmw2m6xWq2bOnKnGxkYtW7bsqOsahqGrrrpK9957r4YMGXLEfk1NTaqpqWmzBMN5j3ygE+94WxuLq4OyfQAA8N1MCzXr1q1TZmamYmNj/W0Wi0U5OTkqKCg46rovvviiXC6XJk+efNR+8+bNU3x8vH9JS0sLyNgPF2HzHsYmlzso2wcAAN/NtFBTWlqqpKSkdu2JiYmqqKg44nqGYejuu+/W3Xff/Z37mDVrlhwOh38pKSk5pjEfSWR4mCSp0cnpJwAAzGIza8fJycmqrq5u115eXq6UlJQjrrdq1SrV1NTo3HPP/c592O122e32Yxlmp9ip1AAAYDrTKjW5ubkqKiqSw+Fo015YWKjs7OwjrvfWW2/pwgsvlNXada5Gp1IDAID5TEsGGRkZmjJlimbMmKHGxkZJ0oIFC+RyuZSXl6elS5cqMzNTpaWlbdYrLCzUiSeeaMaQj4hKDQAA5jO13LFw4UL1799fWVlZysjIUEFBgVasWCGr1SqHw6EtW7a0u7y7rKxMAwcONGnEHaNSAwCA+SyGYRhmDyJUampqFB8fL4fDobi4uIBt99bFn2tx4V79ceIIXT9+WMC2CwAAOv/3u+tMTOnGqNQAAGA+Qk0A+OfUOJlTAwCAWQg1AeCr1DS5qNQAAGAWQk0ARIZ7D2MjlRoAAExDqAkAu41KDQAAZiPUBACVGgAAzEeoCQAqNQAAmI9QEwB2KjUAAJiOUBMAvkoNoQYAAPMQagLAN6eG008AAJiHUBMAh+4oTKUGAACzEGoC4NBTuqnUAABgFkJNAPDsJwAAzEeoCYBDlRpOPwEAYBZCTQD4n/1EpQYAANMQagLAV6lpdnvk8RgmjwYAgN6JUBMAvkqNxGRhAADMQqgJAF+lRuKybgAAzEKoCQBbmFU2q0USlRoAAMxCqAkQbsAHAIC5CDUBwg34AAAwF6EmQKjUAABgLkJNgFCpAQDAXISaALFTqQEAwFSEmgDxVWoINQAAmINQEyCR4Zx+AgDATISaALHbOP0EAICZCDUBQqUGAABzEWoChEu6AQAwF6EmQLikGwAAcxFqAsRXqWmiUgMAgCkINQFCpQYAAHMRagKEOTUAAJiLUBMgh26+R6UGAAAzEGoCxD+nxkWlBgAAMxBqAuTQs5+o1AAAYAZCTYAcmihMpQYAADMQagIkkkoNAACmMjXU1NXVKT8/X+np6UpNTdXkyZNVVlZ2xP7//ve/lZubq9TUVKWnp+vyyy8/av9QolIDAIC5TA0106dPl8Vi0Y4dO1RcXKzRo0dr4sSJcjqd7fpu3bpVEydO1M0336y9e/dqx44dGjhwoH71q1+ZMPL2qNQAAGAum1k73rZtm5YsWaL9+/fLZvMOY+bMmVq0aJGWLVumvLy8Nv3vu+8+TZ06VZdccokkyWaz6aGHHpJhGCEfe0f8l3RTqQEAwBSmVWrWrVunzMxMxcbG+tssFotycnJUUFDQrv97772nc889V3fffbd+9KMfaeTIkbrzzjuPuo+mpibV1NS0WYLl0GMSqNQAAGAG00JNaWmpkpKS2rUnJiaqoqKiXXtZWZn+8pe/aOjQodq0aZNWrVqljRs36te//vUR9zFv3jzFx8f7l7S0tED+hDaYUwMAgLlMCzXJycmqrq5u115eXq6UlJR27QkJCTr55JN11VVXyWazKTExUU8++aReffVV1dXVdbiPWbNmyeFw+JeSkpJA/ww/KjUAAJjLtFCTm5uroqIiORyONu2FhYXKzs5u13/cuHGKj49v0xYZGSnDMORyuTrch91uV1xcXJslWCLDmVMDAICZTAs1GRkZmjJlimbMmKHGxkZJ0oIFC+RyuZSXl6elS5cqMzNTpaWlkqTbbrtNCxYs0CeffCJJqq2t1bRp03TZZZe1CztmsNu8lRqn25Db0zUmLwMA0JuYekn3woUL1b9/f2VlZSkjI0MFBQVasWKFrFarHA6HtmzZ4r+8+4wzztALL7ygG2+8Uccff7xOOeUUnXjiiXr++efN/Al+vkqNxLwaAADMYDG6yjXRIVBTU6P4+Hg5HI6An4pyewwN/dNySdJnt/9EfftEBHT7AAD0Vp39+81jEgIkzGpReJhFEvNqAAAwA6EmgHzzarirMAAAoUeoCSDfvBrm1AAAEHqEmgCiUgMAgHkINQFk91VqnFRqAAAINUJNAEX6KjUuKjUAAIQaoSaAqNQAAGAeQk0AUakBAMA8hJoA8lVqGqnUAAAQcoSaAPJVapqo1AAAEHKEmgBiTg0AAOYh1AQQlRoAAMxDqAmgSObUAABgGkJNANnDqdQAAGAWQk0ARdqo1AAAYBZCTQD5KzU8+wkAgJAj1ASQ3Vep4SndAACEHKEmgHyVGk4/AQAQeoSaAPLNqWGiMAAAoUeoCSAqNQAAmIdQE0BUagAAMA+hJoAi/ZUaQg0AAKFGqAkgu79Sw+knAABCjVATQJHcpwYAANMQagLIzrOfAAAwDaEmgHhKNwAA5iHUBBCVGgAAzEOoCSBfpcblMeRyU60BACCUCDUB5JsoLHEKCgCAUCPUBJDvkm6JUAMAQKgRagLIarUoIox5NQAAmIFQE2C+ycINhBoAAEKKUBNg0RHeeTUNzYQaAABCiVATYH0ibJKkekINAAAhRagJsKiWSk1ds8vkkQAA0LsQagLMV6nh9BMAAKFFqAmwaHtLpaaJSg0AAKFEqAkw30Rh5tQAABBahJoAi2aiMAAApjA11NTV1Sk/P1/p6elKTU3V5MmTVVZW1mHf559/Xv369dOwYcPaLP/6179CPOqj6+Ov1HD6CQCAUDI11EyfPl0Wi0U7duxQcXGxRo8erYkTJ8rpdHbY/4YbbtD27dvbLHl5eSEe9dFFUakBAMAUpoWabdu2acmSJZo/f75sNpusVqtmzpypxsZGLVu2LCD7aGpqUk1NTZsl2KjUAABgDtNCzbp165SZmanY2Fh/m8ViUU5OjgoKCjpcp7KyUtOmTdPIkSM1ZswYPfLII/J4jvzgyHnz5ik+Pt6/pKWlBfx3HC6KicIAAJjCtFBTWlqqpKSkdu2JiYmqqKho1x4eHq6CggJde+21+vzzz/X666/rn//8p37/+98fcR+zZs2Sw+HwLyUlJQH9DR3pY/eefqprItQAABBKpoWa5ORkVVdXt2svLy9XSkpKu/Zf/vKXKioq0pgxY2SxWHTcccfpoYce0jPPPCOXq+NTPXa7XXFxcW2WYIvm9BMAAKYwLdTk5uaqqKhIDoejTXthYaGys7Pb9f/6669VX1/fps1ms8nlch31FFSocUk3AADmMC3UZGRkaMqUKZoxY4YaGxslSQsWLJDL5VJeXp6WLl2qzMxMlZaWSpLmzp2rq6++WuXl5ZKkb775RjfffLOuvvpqRUREmPUz2mGiMAAA5jD1ku6FCxeqf//+ysrKUkZGhgoKCrRixQpZrVY5HA5t2bLFf3n3M888o1NOOUU5OTk6/vjjNWHCBF188cV64oknzPwJ7TBRGAAAc1gMwzDMHkSo1NTUKD4+Xg6HI2jza7aW1er8Rz9Uvz4R2nj7T4KyDwAAepPO/v3mMQkB5psozAMtAQAILUJNgPkmCje5PHJ7ek0RDAAA0xFqAsxXqZGYLAwAQCgRagLMbrMqzGqRJDUwWRgAgJAh1ASYxWJRdHjLvBpCDQAAIUOoCYJoO5OFAQAINUJNEPgmCzc4qdQAABAqhJog4LJuAABCj1ATBH18lRrm1AAAEDKEmiDwPSqBicIAAIQOoSYI+jBRGACAkCPUBEGM3Xv66SChBgCAkCHUBEGMPVwSoQYAgFAi1ARBTGRLpaaRUAMAQKgQaoIgtuX0E3NqAAAIHUJNEPgqNbWEGgAAQoZQEwR97Jx+AgAg1Ag1QRDL1U8AAIQcoSYI/BOFCTUAAIQMoSYIfPepqeX0EwAAIUOoCYIYrn4CACDkCDVBENty+qnB6ZbL7TF5NAAA9A6EmiDwXf0kSXVNPNQSAIBQINQEQXiYVXab99DWNjlNHg0AAL0DoSZIYrkCCgCAkCLUBEkMN+ADACCkCDVBwr1qAAAILUJNkMRwV2EAAEKKUBMknH4CACC0CDVBQqUGAIDQItQEiW9ODY9KAAAgNAg1QRJjD5dEpQYAgFAh1ASJ7z41PP8JAIDQINQECU/qBgAgtAg1QeKr1NQ08pgEAABCgVATJPFR3jk1jgZCDQAAoUCoCRJfqKkh1AAAEBKEmiCJo1IDAEBImRpq6urqlJ+fr/T0dKWmpmry5MkqKyv7zvU2bNigiIgIXXLJJSEY5Q/jr9Q0umQYhsmjAQCg5zM11EyfPl0Wi0U7duxQcXGxRo8erYkTJ8rpPHJ1o66uTtOmTdMVV1wRwpF+f3GR3lDj9hiqa3abPBoAAHo+00LNtm3btGTJEs2fP182m01Wq1UzZ85UY2Ojli1bdsT1brrpJv32t7/VkCFDQjja7y8y3KqIMO/hZV4NAADBZ1qoWbdunTIzMxUbG+tvs1gsysnJUUFBQYfrLFu2TNu3b9f06dM7tY+mpibV1NS0WULFYrEoLsp7WTfzagAACD7TQk1paamSkpLatScmJqqioqJde3l5uX7/+9/r2WeflcVi6dQ+5s2bp/j4eP+SlpZ2zOP+PuK4AgoAgJAxLdQkJyerurq6XXt5eblSUlLatV977bW65ZZbvtdpp1mzZsnhcPiXkpKSYxny9+abV0OlBgCA4DMt1OTm5qqoqEgOh6NNe2FhobKzs9u0bd68WWvWrNGDDz6ojIwMZWRk6H/+53/0/vvvKyMjQx9//HGH+7Db7YqLi2uzhBI34AMAIHRMCzUZGRmaMmWKZsyYocbGRknSggUL5HK5lJeXp6VLlyozM1OlpaU68cQTVV1drT179mj37t3avXu3brzxRuXm5mr37t0aN26cWT/jqOJaXdYNAACCy9RLuhcuXKj+/fsrKytLGRkZKigo0IoVK2S1WuVwOLRly5ajXt7d1cUzURgAgJCxGL3oznA1NTWKj4+Xw+EIyamoB9/+j/539Q79+qwM3fXTk4K+PwAAeqLO/v3mMQlBxPOfAAAIHUJNEB2aU0OoAQAg2Ag1QcTVTwAAhA6hJogOnX7i6icAAIKNUBNE3HwPAIDQIdQEEaefAAAInWMKNYZhKD8/v117VVWVzjrrrGPZdI/ge6Blg9OtZpfH5NEAANCzfe9Qc8stt8jj8f6Btlgs+vDDD9v1eeGFF0L+SIKuKC4yXNaWZ29W1zebOxgAAHq47x1q3nnnHVmth1Y7/InZu3fv1v3336+5c+ce++i6OavVooToCEnSgXpOQQEAEEzfO9QcHmJaf962bZsmTpyoOXPm6Mc//vGxj64H6BvtnVdTVUelBgCAYLJ93xUODzUej0dr167Vyy+/rJUrV+ovf/mLLrjggoANsLvrGx0hqU4HOP0EAEBQdSrUfPTRRyoqKpLdbteBAwf03HPP+b/bunWrLr/8ct1zzz16+OGHFREREbTBdkd9+/hOPxFqAAAIpk6Fmr1792rDhg2KjIxUfX29Pv30U/93sbGxio+P17x58zRw4ECqNIfp55tTw+knAACCqlOh5oorrtAVV1whSVqzZo0WLlzo/2716tX64osv9OGHHyo/P1/XXHONbrvttuCMthtK6OObU8NEYQAAgqnTE4U3bdqkmpqaI04Uzs7O1po1a7Ro0SL961//CuwouzFfpYZLugEACK5Oh5oHHnhA/fv319atW7V27doO+yQlJWnx4sWaMWOGKisrAzbI7qxvS6ipItQAABBUnQ41f//731VcXKx7771XV155pa644gpVVFS065eVlaVJkybp+eefD+Q4uy3/RGHm1AAAEFTf6z41AwYM0K233qrNmzdr8ODB+uqrr9Tc3P6P9ZVXXql33303YIPszvq1zKnh5nsAAATX975PjSRFRkbqgQcekCS9//777b4/9dRTO3wmVG+UwNVPAACERKdDzQcffKC4uDh5PB5FRETo5JNP1h//+Md2/W6//Xbdfffdqqqq0i9+8YuADrY78k0Urm1yqdnlUYSNB6MDABAMnQ41l112mSZMmCCPx6PKykq9//77WrZsmWbOnNmm3+bNm7Vo0SJt3rw54IPtjuKivA+19BhSdUOzkmMjzR4SAAA9UqdDTVZWll555RVJUm5uriRp4MCBmjp1apt+EyZM0B133KGkpKQADrP7CrNaFB8VrgP1Th2ocxJqAAAIkk6HmsPvT+Pzj3/8Q48//rjGjBmjX/7yl3rkkUd0yimnBGyAPUHfPhE6UO/koZYAAATRD5oo3Fp2draSkpL0+eefa+rUqTr11FP15JNPKjKSioRPv+gI7VQdN+ADACCIOj1rtaysTP/4xz/06quv+tssFosGDhyo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pxUrVshms2n58uXav3+/nnrqKe3cuVP9+/fXNddco5kzZwbvoAH4wXigJYCgWbVqlT766CPt2bNHZWVlys7O1pgxYzR+/HhJ3lBz8OBBSd4KiGEYCgsL0+uvv668vDw9/PDDSk1N1SeffKKysjJ9+umnqq6uVv/+/dW3b1+lpKRoxIgRuvfee/37LC0tVUREhCwWi4YNG6bt27dr7dq1crlc+tnPfqZHH31Ua9as0ZIlSyR5JxNfeumlysrK0pIlSxQdHa28vDxdcsklOvPMMzV37lz94Q9/0JgxY7R06VINGjQo5McRQOdQqQEQNBMmTNCECRO0evVqzZ8/XxEREfrjH/8oq9Uqj8ejpqYmnXHGGZK8oeY3v/mN4uPj9d///d8aPny4JKl///4aP3680tPTVVBQoM2bN+vZZ5894j7r6ur0yCOPyOPx6MILL1RSUpIKCwvV1NSkn/3sZyosLNTcuXMlSS6XS9dcc4369u2r2267Te+9955eeuklLVq0SH/+8581a9Ys7d69W5JUVVWllJSU4B4wAMeEUAMgZG688UbdeOONkqSPP/5Ys2bN0htvvKGEhARJ3lNDv/jFL/T888+roKBAkveKJJ+Kigq9/vrrR93H4sWLNWjQIM2ePVsbN26UJFmtVv9VVi+++KK/r2EYuvjiizVlyhRddtlluuaaazR8+HDl5+dr7dq1mj17ti666CJVVVWpT58+R53UDMB8hBoApnjggQeUkJCgsWPH6p133lFGRobCw8P9ocUXalo744wztHHjRtXU1CguLq7D7b777rt6/fXXdeqppyozM1OStHfvXu3bt69d3/DwcL3//vt68skntWHDBjU0NGjhwoW64IILtHLlSknScccdp7/+9a/66U9/GqifDiBIuPoJQEi5XC7deOONam5u1uuvv66rrrpK48aN0+eff/6d68bExOiiiy7S008/3eH3X3zxhQYNGqSEhARNmDBBkrf689Zbb+mzzz6Tw+Fot85TTz2la6+9VldccYXefPNNjRkzps0VU9OmTdOcOXN09dVX/8BfDCBUCDUAgs53J+Avv/xSmZmZqq6u1uuvvy6LxaLbb79d9913ny6++GLV1tZ+57buuOMOPfDAA9q1a5ck6YYbbtD+/fslSf/7v/+rSy65pE3/+fPn65xzztG0adP0+OOPd7jN4uJirVu3Tq+99preffddXXrppf7vKioqJHnvZwOgizMAIEgOHDhg3HPPPcZpp51mXHjhhcZll11mPPnkk0ZlZaXhdDrb9K2qqmrz+brrrjMeffTRDrf75JNPGiNGjDD27NljDB482Fi3bp1RWVlp9OnTx6isrPT3e+WVV4yMjAyjtLTUqK6uNk444QSjsLDwiNuUZNx8883+tk2bNhmpqanG6tWrjWHDhhlvv/32DzwSAEKBOTUAguajjz7SN998o9WrVys6Olp///vf9eyzz+rmm29WXV2dLBaLLBaLrFarLBaLzjrrLK1atUoWi0XNzc1yuVwdbjc/P18ul0unn3666urqFBkZqSeeeEKZmZlKTExUcXGx5s6dq/fee0/Lli3zX7X05JNP6qc//akWLlyoSZMmSZLeeustLV++XG+//baeeOIJ3XvvvRo5cqSqq6t1991364UXXlBOTo4WL16svLw8nX/++XriiSdCdgwBdB73qQFgioaGBjU1NfmDjcViUUREhOx2uyTplltu0fDhw9vcNfhwW7Zs0YMPPqjHHntM1dXV2rNnj0444QSNHz9e5513nu6880717du3zToffvihfvWrX+m8887Ts88+q7feeksVFRW69NJLlZCQoKKiIhmGoWuvvVaPP/64xo4d61+3trZWn376qXJzc4NzUAAcE0INgB7HMIyjXn7d1NSk/fv3Kz09PYSjAhBshBoAANAjcPUTAADoEQg1AACgRyDUAACAHoFQAwAAegRCDQAA6BEINQAAoEcg1AAAgB7h/wOruH62tVjtXwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#your code here------\n", "omega = np.zeros((1,2))\n", "omega = np.hstack((np.ones((1,1)), omega))\n", "lr = 0.1\n", "iter_nums = 5000\n", "J_loss = np.zeros((5000, 1))\n", "test_loss = np.zeros((5000, 1))\n", " \n", "for _ in range(iter_nums):\n", " derivatives = X * (np.exp(X @ omega.T) / (1 + np.exp(X @ omega.T)) - Y)\n", " derivatives = derivatives.mean(axis=0, keepdims=True)\n", " omega -= lr * derivatives\n", " J_loss[_] = (- np.log((Y * (1 / (1 + np.exp(-X @ omega.T))) + (1 - Y) * (1 - 1 / (1 + np.exp(-X @ omega.T)))).mean()))\n", "\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei'] \n", "plt.plot(J_loss)\n", "plt.xlabel('迭代次数')\n", "plt.ylabel('损失')" ] }, { "cell_type": "markdown", "id": "b24f2e7e", "metadata": {}, "source": [ "4)在模型训练完成后得到所训练的模型参数$\\omega$,在测试集上进行所训练模型的测试并使用之前所介绍的损失函数计算loss值" ] }, { "cell_type": "code", "execution_count": 14, "id": "a4253a5c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.19127137])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#your code here------\n", "X_test = np.hstack((np.ones((len(df_test), 1)), df_test[['x1', 'x2']]))\n", "df_test = df_test.replace(\"Iris-setosa\", 0)\n", "df_test = df_test.replace(\"Iris-versicolor\", 1)\n", "Y_test = np.array(df_test['type'].values).reshape(-1, 1)\n", "Y_model = 1 / (1 + np.exp(-X_test @ omega.T))\n", "J = - np.log((Y_test * (1 / (1 + np.exp(-X_test @ omega.T))) + (1 - Y_test) * (1 - (1 / (1 + np.exp(-X_test @ omega.T)))))).mean(axis=0)\n", "J" ] }, { "cell_type": "code", "execution_count": 15, "id": "f81fcd46", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.37855036, 4.59081076, -8.22686347]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "omega" ] }, { "cell_type": "markdown", "id": "dd339060", "metadata": {}, "source": [ "5)使用训练后的逻辑回归模型对测试数据集'flower_test.csv'进行预测,输出可视化结果(比如用seaborn或者matplotlib等可视化库来画出测试数据的散点图以及训练好的模型函数图像),要求如下: \n", " 1.将所得到的逻辑回归模型所得到的决策边界绘制出来 \n", " 2.测试集的所有点在同一幅图中进行绘制 \n", " 3.需要给不同类别的测试点不同颜色,方便通过颜色的区别直观看到预测正确和错误的样本" ] }, { "cell_type": "code", "execution_count": 16, "id": "3597e87c", "metadata": {}, "outputs": [ { "data": { "image/png": "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X345CxcurLK9KX1oyAV99tlnxrBhw4yYmBhj4cKF52yzbds2o0WLFkZ6erphGIaRkZFhtG/f3vjggw88WepFqc75rVy50vj1r3/t2cJqwcCBA429e/dWq60V+7Am52fFPnzppZeMyy+/3MjKyjIMwzCysrKMTp06GfPmzTurrRX7zzBqdo5W7MMzvfHGG8att956zq9ZtQ/PdL5ztGIfxsXFGRMnTjTKy8sNwzCMnJwco2PHjkZqaupZbc3qQ4WZC8jNzTW6detmZGVlnfdi/6tf/cp46qmnKh1bsGCB0bNnT0+UedGqe35W/AE0jJpd7K3Yh74cZgoKCowGDRoYGzdurHT8xIkT52xvxf6r6TlarQ/PtGXLFqNdu3bGsWPHzvl1K/bhmS50jlbsw4iICOOjjz6qdOzGG280Fi9efFZbs/pQw0wXcP/99zNp0iSioqLO22716tX069ev0rFBgwaxadMmDh48WJclXpLqnh9AYWEhkydPJj4+nvj4eKZMmUJJSYkHqrw0KSkpXH/99XTr1o0hQ4awdu3ac7azah9W9/zAWn24du1aGjduTGhoKImJiXTq1ImBAwfyzTffnLO9FfuvpucI1urDMz300EP84Q9/oFGjRuf8uhX78EwXOkewXh9OnTqVe++9l1dffZXFixdz++23ExAQwJAhQ85qa1of1mlUsrh//OMfxtChQ099fr47FyEhIcbq1asrHSsrKzMAY9OmTXVa58WqyfmlpKQYrVq1Mj777DOjoqLCOHr0qHHbbbcZw4YN81S5F+W6664z7rnnHiM3N9cwDMNYunSpER4ebqxZs+astlbsw5qcn9X6cN68eUbHjh2NIUOGGFu3bjUMw30OjRo1Mj799NOz2lux/2p6jlbrw9N9/fXXRkxMzKmhinOxYh+erjrnaMU+3L9/vzFkyBCjadOmRqtWrYzmzZsb77///jnbmtWHCjNV2L17txEdHX1qHNswzn+xj46ONpYtW1bpWFZWlgEYR44cqdNaL0ZNz88w3H8hT3fy/E5/DW9TXl5uuFyuSsfuvfde49577z2rrdX60DBqdn6GYa0+XLp06Tl/AT777LPGyJEjz2pvxf6r6TkahrX68HR33XWXMXHixPO2sWIfnq4652gY1urDjIwMo1WrVsabb75pVFRUGC6Xy1i2bJnRunVr48UXXzyrvVl9qGGmKrz99tsUFxczYMAAYmNjiY2NJSsriwcffJD+/fuf1f66667j66+/rnTshx9+oHv37jRp0sRTZVdbTc8vIyOD3NzcSscCA90PXS8rK/NIzTVVVlbGhg0bsNlslY4HBgaes2ar9WFNz89qffiLX/yCoKCgs56aGxoaSkVFxVntrdZ/UPNztFofnm7ZsmXcdNNN521jxT48XXXO0Wp9uGjRItq3b899992H3W7HZrMxZMgQnnnmGebNm3dWe9P6sM5ikg86/c7F2rVrjc6dOxtr1641DMM9g7tly5bGd999ZxiGe7Z3jx49LDUL/3zn9+STTxpXXHHFqcmmx48fN2699VZj8ODBZpV7QQcOHDCaNGlivPXWW6f+RXFyGGblypWW78Oanp8V+3Ds2LHG0KFDjaNHjxqGYRjr1683IiMjjaVLl1q+/06qyTlasQ8NwzD27t1rAEZOTk6l477Sh4ZR/XO0Wh9+8803Rnh4uLFixYpTx/bv329ce+21xn333ec1fagwUwOnX+xXrlxpAMbKlStPff2bb74x+vXrZ7Rt29bo3Lmz8eabb5pU6cU53/k5nU7jtddeM7p37260a9fOaNu2rfH4448bBQUFJlZ8YVu2bDFuvfVWo0OHDobD4TCuueYa44svvjAMwzf6sCbnZ8U+LCsrM6ZMmWK0a9fOiImJMfr27Wt88sknhmH4Rv8ZRs3O0Yp9aBiGsWbNGiMgIMCoqKiodNxX+tAwqn+OVuzDL7/80hg6dKjRrl07IzY21ujUqZPxxBNPGCUlJV7Th3rQpIiIiFia5syIiIiIpSnMiIiIiKUpzIiIiIilKcyIiIiIpSnMiIiIiKUpzIiIiIilKcyIiIiIpSnMiIjlffrpp9SvX5/vv//e7FJExASBZhcgInKxCgsLeemll1i7di1FRUVmlyMiJtGdGRHxeh9++CGxsbEUFhYCkJSUxD//+U8mTpzIiRMnWLZsmckVioiZ9DgDEbGEW265hU6dOnHVVVfx5ptvsmzZMvLz8wkPDwfAZrOxfv16+vbta3KlIuJpCjMiYgmZmZn06tWLpk2bsnLlSqKjoyt9XWFGxH9pmElELCE6OpqBAwcSEBBAy5YtzS5HRLyIwoyIWMKXX37JwYMHadmyJdOnTze7HBHxIlrNJCJer6ioiLFjx7Jw4UICAgLo168fd9xxB126dDG7NBHxApozIyJe7+GHHyY8PJznn38egClTppCSkkJoaCi7d+8GYPfu3TgcDkJCQoiJiWHFihVmliwiHqQwIyIiIpamOTMiIiJiaQozIiIiYmkKMyIiImJpCjMiIiJiaQozIiIiYmkKMyIiImJpCjMiIiJiaQozIiIiYmkKMyIiImJpCjMiIiJiaf8f3H/aX/c/gXgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#your code here------\n", "class_1 = df_test[df_test['type'] == 1]\n", "class_0 = df_test[df_test['type'] == 0]\n", "plt.scatter(class_1['x1'], class_1['x2'], c='blue')\n", "plt.scatter(class_0['x1'], class_0['x2'], c='red')\n", "x_ = np.linspace(4, 8)\n", "y_ = -(omega[0][0] + omega[0][1] * x_) / omega[0][2]\n", "plt.xlabel(\"x1\")\n", "plt.ylabel(\"x2\")\n", "plt.plot(x_, y_)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "b869bee1", "metadata": {}, "source": [ "**第三部分:逻辑回归实验二**" ] }, { "cell_type": "markdown", "id": "cf3a5a55", "metadata": {}, "source": [ "该数据集(train_titanic.csv和test_titanic.csv)同样为分类数据集,为泰坦尼克号的乘客信息以及最后是否生还。包括了七个特征值以及一个类别特征(即为Survived类型,代表是否生还),特征信息分别为Passengerid(乘客id),Age(乘客年龄),Fare(船票价格),Sex(性别),sibsp(堂兄弟妹个数),Parch(父母与小孩的个数),Pclass(乘客等级)" ] }, { "cell_type": "markdown", "id": "f4a492fe", "metadata": {}, "source": [ "该数据集已经做了处理,无缺失值和空值,且字符串类型全部转换成了整数类型,但是七个特征值与最后是否生还关联度不同。该实验的任务依然是在训练集上使用逻辑回归方法和手动实现的梯度下降方法完成模型训练。" ] }, { "cell_type": "code", "execution_count": 17, "id": "7ebd3c1e", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import math" ] }, { "cell_type": "markdown", "id": "915ff106", "metadata": {}, "source": [ "1) 使用pandas库将训练数据集'train_titanic.csv'与测试数据集'test_titanic.csv'载入到Dataframe对象中。" ] }, { "cell_type": "code", "execution_count": 18, "id": "7056ffde", "metadata": {}, "outputs": [], "source": [ "#your code here------\n", "test_file = pd.read_csv(\"test_titanic.csv\")\n", "df_test = pd.DataFrame(test_file)\n", "train_file = pd.read_csv(\"train_titanic.csv\")\n", "df_train = pd.DataFrame(train_file)\n", "df_train.isnull().sum() # 0个空值\n", "df_test.isnull().sum() # 0个空值\n", "df_test.drop(columns=['Passengerid'], inplace=True)\n", "df_train.drop(columns=['Passengerid'], inplace=True)" ] }, { "cell_type": "markdown", "id": "9abde442", "metadata": {}, "source": [ "2) 选择至少四个特征建立逻辑回归模型,利用梯度下降方法(由于该数据集样本数量较大,所以建议使用随机梯度下降法或小批量梯度下降法)进行模型训练,并使用10次10折交叉验证进行模型选择。\n", "$$J(\\omega)=-\\frac{1}{m}\\sum^m_{i=1}{lnP(y_i|x_i,\\omega)}=-\\frac{1}{m}\\sum^m_{i=1}ln(y_i\\frac{1}{1+e^{-\\omega^T x_i}}+(1-y_i)\\frac{e^{-\\omega^T x_i}}{1+e^{-\\omega^T x_i}})$$" ] }, { "cell_type": "code", "execution_count": 19, "id": "1d2589e4", "metadata": {}, "outputs": [], "source": [ "#your code here------\n", "from typing import Tuple\n", "from sklearn.model_selection import KFold\n", "train_y = np.array(df_train)[:, -1]\n", "test_y = np.array(df_test)[:, -1]\n", "arr_train = np.array(df_train)[:, :-1]\n", "arr_train = np.hstack((np.ones((len(arr_train), 1)), arr_train))\n", "arr_test = np.array(df_test)[:, :-1]\n", "arr_test = np.hstack((np.ones((len(arr_test), 1)), arr_test))" ] }, { "cell_type": "code", "execution_count": 20, "id": "55e62317", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.5364460912968234,\n", " array([0.55588803, 0.55630276, 0.5493315 , 0.54423284, 0.53857519,\n", " 0.5453373 , 0.63908262, 0.53644609, 0.56100027, 0.54296598]))" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# def loss(x, y, omega):\n", "# # pre = y / (1 + np.exp(-x @ omega.T))\n", "# # post = (1 - y) * (np.exp(-x @ omega.T) / (1 + np.exp(-x @ omega.T)))\n", "# # return - np.log(pre + post).mean() 会出现nan\n", "# z = x @ omega.T\n", "# return (np.logaddexp(0.0, z) - y * z).mean()\n", "def loss(x, y, omega):\n", " z = (x @ omega.T).reshape(-1)\n", " y = y.reshape(-1)\n", " return (np.logaddexp(0.0, z) - y * z).mean()\n", "\n", "# def sgd_cross_vali(train_set: np.array, test_set: np.array, omega: np.array,\n", "# train_y: np.array, test_y: np.array, batch_size = 64, lr: float = 1e-4, iter_nums: int = 5000) -> Tuple[np.array, float]:\n", "# rng = np.random.default_rng(42) # 提升性能\n", "# for _ in range(iter_nums):\n", "# idx = rng.permutation(train_set.shape[0]) # 提升性能\n", "# for i in range(0, len(train_set), batch_size):\n", "# i = idx[i: i + batch_size]\n", "# X = train_set[i, :]\n", "# z = train_set[i, :] @ omega.T\n", "# # print(z.shape)\n", "# p = 1 / (1 + np.exp(-z))\n", "# p = np.clip(p, 1e-12, 1 - 1e-12)\n", "# print(X.shape, p.shape, train_y[i].shape) # p.shape (64,1) , train_y[i].shape (64,) -> broadcast to (64, 64)\n", "# grad = X.T @ (p - train_y[i]) / z.shape[0]\n", "# print(grad.shape, omega.shape)\n", "# omega -= lr * grad\n", "\n", "# z_test = test_set @ omega.T\n", "# p_test = 1 / (1 + np.exp(-z_test))\n", "# return omega, loss(test_set, test_y, omega)\n", "\n", "def sgd_cross_vali(train_set: np.array, test_set: np.array, omega: np.array,\n", " train_y: np.array, test_y: np.array, batch_size = 64, \n", " lr: float = 1e-4, iter_nums: int = 1000, graph: bool = False) -> Tuple[np.array, float]:\n", " rng = np.random.default_rng(42) # 提升性能\n", " if graph:\n", " J_hist_a = np.zeros((iter_nums, 1))\n", " J_hist_b = np.zeros_like(J_hist_a) \n", " for _ in range(iter_nums):\n", " idx = rng.permutation(train_set.shape[0]) # 提升性能\n", " for i in range(0, len(train_set), batch_size):\n", " i = idx[i: i + batch_size]\n", " X = train_set[i, :]\n", " z = train_set[i, :] @ omega.T\n", " p = 1 / (1 + np.exp(-z))\n", " p = p.reshape(-1)\n", " grad = X.T @ (p - train_y[i]) / z.shape[0]\n", " omega -= lr * grad\n", " if graph:\n", " J_hist_a[_] = loss(train_set, train_y, omega)\n", " J_hist_b[_] = loss(test_set, test_y, omega)\n", "\n", " loss_ = loss(test_set, test_y, omega)\n", " if graph:\n", " return omega, loss_, J_hist_a, J_hist_b\n", " else: \n", " return omega, loss_\n", "\n", "\n", "col_index = [\n", " [0, 1, 2, 3, 4], \n", " [0, 1, 3, 4, 5], \n", " [0, 2, 3, 5, 6], \n", " [0, 1, 2, 3, 6],\n", " [0, 1, 3, 4, 6],\n", " [0, 1, 4, 5, 6],\n", " [0, 2, 3, 4, 5],\n", " [0, 3, 4, 5, 6],\n", " [0, 1, 2, 4, 5],\n", " [0, 1, 2, 3, 4, 5, 6]\n", "]\n", "all_J = np.zeros((10,))\n", "for i in range(10):\n", " cols = col_index[i]\n", " for fold, (train_idx, test_idx) in enumerate(KFold(n_splits=10).split(arr_train)): #调用第三方库简化交叉验证\n", " X_train, X_test = arr_train[train_idx][:, cols], arr_train[test_idx][:, cols]\n", " y_train, y_test = train_y[train_idx], train_y[test_idx]\n", " omega = np.zeros((1, len(cols)))\n", " # omega = np.hstack((np.ones((1,1)), omega))\n", "\n", " omega, J = sgd_cross_vali(X_train, X_test, omega, y_train, y_test)\n", "\n", " all_J[i] += J / 10\n", "\n", "all_J.min(), all_J" ] }, { "cell_type": "code", "execution_count": 21, "id": "4243e7bc", "metadata": {}, "outputs": [], "source": [ "def bgd_cross_vali(train_set: np.array, test_set: np.array, omega: np.array,\n", " train_y: np.array, test_y: np.array, \n", " lr: float = 1e-4, iter_nums: int = 1000, graph: bool = False) -> Tuple[np.array, float]:\n", " if graph:\n", " J_hist_a = np.zeros((iter_nums, 1))\n", " J_hist_b = np.zeros_like(J_hist_a) \n", " for _ in range(iter_nums):\n", " X = train_set\n", " z = train_set @ omega.T\n", " p = 1 / (1 + np.exp(-z))\n", " p = p.reshape(-1)\n", " grad = X.T @ (p - train_y) / z.shape[0]\n", " omega -= lr * grad\n", " if graph:\n", " J_hist_a[_] = loss(train_set, train_y, omega)\n", " J_hist_b[_] = loss(test_set, test_y, omega)\n", "\n", " loss_ = loss(test_set, test_y, omega)\n", " if graph:\n", " return omega, loss_, J_hist_a, J_hist_b\n", " else: \n", " return omega, loss_" ] }, { "cell_type": "markdown", "id": "95f698bc", "metadata": {}, "source": [ "3) 使用训练后的逻辑回归模型对测试数据集'test_titanic.csv'进行预测,并计算其精度,查准率,查全率,画出P-R曲线,画出ROC曲线。" ] }, { "cell_type": "code", "execution_count": 22, "id": "4dd020b7", "metadata": {}, "outputs": [ { "data": { "image/png": "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vnwZISEh2LFjBzp37owLFy6YvzN//nz8999/cHFxQbdu3ZCTkwOFQoGrV6/i888/xzfffIPu3bvD3d0dmzdvxubNm0uc99ZmPrVaja+//ho//fQTnnjiCfN6Ozs7HDhwAJ06dQIg3T+dTlfqf59ENQ3/KyWq4bKysqBSqSCXy2FjY1PmD35p0tLSMGXKFLi4uOB///sfoqOjsXLlSqhUKnz55Zd45513kJycjFmzZmH27Nn4+OOPS/0X/bRp03Dt2jV07NgRCxYswKZNm8wh5+zZszh48CD27dsHQApB/v7++Oqrr8zf37p1K1566SU4ODhACIH4+Hg4Ozvjxx9/hFarRd++fW97HdevX0fv3r2xf/9+i5opwLKmzESlUpXrPpVWS2P6XvEwZNrv3LlzGDx4MCZMmIANGzagW7dusLOzAwAUFBRAr9dbXEtBQQHef/999OjR445luZ3CwkLY2NhYrFu7di0GDhxoPo+9vT0AKQinpKQgKirKoiZp/vz55vd///23+X1YWBjGjx9vEWzfe++9cpXrzTffRIMGDTB48ODb7ieTySrUd4rImhiMiGq4wMBAaLVaGI1GjBgxAl9//XW5v2tjY4OpU6eiefPm+O6776BUKjF27FgAwMSJExEbGwuZTIaPP/4YnTp1snjqyyQ+Ph4XLlxAREQExowZg0mTJlW4xmjo0KEYOnQoAOCff/5B+/bt8dxzz+H//u//zPvcromlfv36WLx4MYYPH45///3XXJMDlF1Tdqvx48cjLi4OMpkMjRs3xvr16yGEKBGOHBwcAEhPwDk7O1ts27p1K9544w106NABe/bssQgYphojU0C8W02bNrUok16vR2hoqEXtT1ny8vIwdepUzJgx4646Px8/fhxjxowpc3v79u2xfv16AEBiYiLWrVuH3bt331UzIFFNxWBEVMNpNBrIZDLMmzevXD+Oxbm7u2PatGm4cOECtm3bhpiYGPO2vLw8fPXVV/jrr79ue4zAwEDs2rXL/PnDDz+0GArg3Llz+PPPP/Hbb78BkGpa7OzssGfPnlKPZ3rUf82aNRgyZEi5H9d/4YUXEBQUhMWLF+P1118v13eKe+ONN6DVarFz5058//33AICpU6di8+bNUCgUSEtLg7u7O5555hk4OzsjOTkZ9evXL3EMAIiKikJycrLFU3AFBQXQ6XQW67RaLV55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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#your code here------\n", "omega = np.zeros((1, 5))\n", "train_y = np.array(df_train)[:, -1]\n", "test_y = np.array(df_test)[:, -1]\n", "arr_train = np.array(df_train)[:, :-1]\n", "arr_train = np.hstack((np.ones((len(arr_train), 1)), arr_train))\n", "arr_test = np.array(df_test)[:, :-1]\n", "arr_test = np.hstack((np.ones((len(arr_test), 1)), arr_test))\n", "\n", "lr = 1e-3\n", "batch_size = arr_train.shape[0]\n", "itera = 5000\n", "col = [0, 3, 4, 5, 6]\n", "omg, J, J_his_a, J_his_b = sgd_cross_vali(train_set=arr_train[:, col], test_set=arr_test[:, col], omega=omega,\n", " train_y=train_y, test_y=test_y, batch_size=batch_size, lr=lr, iter_nums=itera, graph=True)\n", "plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei'] \n", "plt.plot(J_his_a, label=\"训练集\")\n", "plt.plot(J_his_b, label=\"测试集\")\n", "plt.legend()\n", "plt.xlabel(\"迭代次数\")\n", "plt.ylabel(\"损失\")\n", "plt.title(\"训练集和测试集上的损失\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 23, "id": "e62112b0", "metadata": {}, "outputs": [ { "data": { "image/png": "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ffnyyy85evQov/76K82bN6d48eK88847jtcGBwfz9ttv079/f7755huOHj3K0qVLefbZZ6lbty6dOnXK0FoNw+DIkSN8++23dO7cmWrVqnH16lUA5syZw/vvv0/p0qXZunUrYL9LLCAgIENrEJHMpfAjIlnizTff5MyZM471sP71r3/x73//m+nTp1O5cmU6d+7smDH5n8tKTJgwgQkTJvDpp59SqVIl+vfvT7t27Vi2bFmGXXaaO3cugYGB5M2blx49enDp0iWGDRvGrl272LZtG02aNOGNN95g1qxZ/P777/z+++8MHDiQ+Ph43N3dM6QGEckamuFZRHKF//73v7Rv394xo/O9/HOG5yNHjrB48WJeeukl/Pz8OHLkCKNGjWL9+vVcuHCBzp07M2HCBIoXLw7A/v37adGiBa6urlgsFk6ePJlZH01EMphudReRXCEpKYnixYtz/vz5NO3/3Xff8cUXXzi2H330Ud5++23Htp+fH+fOnaN3795069aNUqVKpXh9pUqV2Lt3L6+++mqqt+2LSPaknh8RyRVsNhtJSUlp7vkREeel8CMiIiJORQOeRURExKko/IiIiIhTUfgRERERp6LwIyIiIk7FqW51t9lsnDt3Dh8fH63HIyIikkMYhkF0dDQlS5bExeXB+22cKvycO3futrk6REREJGc4ffo0fn5+D3wcpwo/Pj4+gP0Pz9fX1+RqREREJC2ioqIoVaqU43v8QTlV+Ll5qcvX11fhR0REJIfJqCErGvAsIiIiTkXhR0RERJyKwo+IiIg4FYUfERERcSoKPyIiIuJUFH5ERETEqSj8iIiIiFNR+BERERGnovAjIiIiTkXhR0RERJyKwo+IiIg4FdPDz4wZM3Bzc+Py5ct33S8sLIzg4GACAgKoUKECoaGhWVShiIiI5CamLWx65coV3n33XQ4ePEhycvJd9z148CBdu3Zl9erVVKlShVOnTtGkSRPy5MlD+/bts6hiERERyRCJMRB1EpJi07Z/dBr3SyPTwk/37t2pVasWQ4cOpWzZsnfdd+zYsbz66qtUqVIFAH9/f8aMGcOHH3541/CTkJBAQkKCYzsqKipjihcREZHUWRMgOhwiT6T8ifrrv3F3v9pzU/i1/PT58Vk+aL4iQ8szLfzMnj0bX19fTp48ec99N2/ezIsvvpiirWHDhrz00ktcvHiRYsWK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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import roc_curve, auc\n", "\n", "y_label = test_y\n", "y_model = arr_test[:, col] @ omg.T\n", "y_model = 1 / (1 + np.exp(-y_model))\n", "fpr, tpr, thresholds = roc_curve(y_label, y_model)\n", "roc_auc = auc(fpr, tpr)\n", "\n", "# 绘制ROC曲线\n", "plt.figure()\n", "plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC曲线 (AUC面积 = %0.2f)' % roc_auc)\n", "plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n", "plt.xlim([0.0, 1.0])\n", "plt.ylim([0.0, 1.05])\n", "plt.xlabel('假阳性')\n", "plt.ylabel('真阳性')\n", "plt.title('ROC曲线')\n", "plt.legend(loc=\"lower right\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 24, "id": "170e5c65", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6214862159990859" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "J" ] }, { "cell_type": "code", "execution_count": 25, "id": "039d668b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.62, 0.5)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "TP = y_label == (y_model >= 0.5).reshape(-1)\n", "FP = y_label != (y_model >= 0.5).reshape(-1)\n", "FN = y_label != (y_model < 0.5).reshape(-1)\n", "Precision = TP.sum() / (TP.sum() + FP.sum())\n", "Recall = TP.sum() / (TP.sum() + FN.sum())\n", "Precision, Recall" ] }, { "cell_type": "code", "execution_count": 26, "id": "2f64bc4b", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import precision_recall_curve\n", "import matplotlib.pyplot as plt\n", "\n", "# 假设 y_label 是真实标签 (0/1),y_model 是模型输出的概率(越大越像1)\n", "precision, recall, thresholds = precision_recall_curve(y_label, y_model)\n", "\n", "plt.figure(figsize=(6,6))\n", "plt.plot(recall, precision, label=\"PR 曲线\")\n", "plt.xlabel(\"查全率\")\n", "plt.ylabel(\"查准率\")\n", "plt.title(\"PR曲线\")\n", "plt.legend()\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "41795e7e", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "transformer", "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.8.20" } }, "nbformat": 4, "nbformat_minor": 5 }