From 29098aca790c1bd8ec4ce41e5b85ff360993e69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=B2=82=E9=92=8A?= <13190667+Yizhao_Wu4926@user.noreply.gitee.com> Date: Sat, 15 Jul 2023 14:50:33 +0000 Subject: [PATCH] =?UTF-8?q?=E5=B9=B3=E6=97=B6=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吴沂钊 <13190667+Yizhao_Wu4926@user.noreply.gitee.com> --- 购物评论 情感分类/水质new.ipynb | 568 +++++++++++++++++++++++++ 购物评论 情感分类/泰坦尼克.ipynb | 698 +++++++++++++++++++++++++++++++ 购物评论 情感分类/短信.ipynb | 176 ++++++++ 3 files changed, 1442 insertions(+) create mode 100644 购物评论 情感分类/水质new.ipynb create mode 100644 购物评论 情感分类/泰坦尼克.ipynb create mode 100644 购物评论 情感分类/短信.ipynb diff --git a/购物评论 情感分类/水质new.ipynb b/购物评论 情感分类/水质new.ipynb new file mode 100644 index 0000000..fcf766d --- /dev/null +++ b/购物评论 情感分类/水质new.ipynb @@ -0,0 +1,568 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "id": "f6e7da09-3bbb-4298-9a81-d3b09d8e6b83", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['images/1_1.jpg',\n", + " 'images/1_10.jpg',\n", + " 'images/1_11.jpg',\n", + " 'images/1_12.jpg',\n", + " 'images/1_13.jpg',\n", + " 'images/1_14.jpg',\n", + " 'images/1_15.jpg',\n", + " 'images/1_16.jpg',\n", + " 'images/1_17.jpg',\n", + " 'images/1_18.jpg',\n", + " 'images/1_19.jpg',\n", + " 'images/1_2.jpg',\n", + " 'images/1_20.jpg',\n", + " 'images/1_21.jpg',\n", + " 'images/1_22.jpg',\n", + " 'images/1_23.jpg',\n", + " 'images/1_24.jpg',\n", + " 'images/1_25.jpg',\n", + " 'images/1_26.jpg',\n", + " 'images/1_27.jpg',\n", + " 'images/1_28.jpg',\n", + " 'images/1_3.jpg',\n", + " 'images/1_30.jpg',\n", + " 'images/1_31.jpg',\n", + " 'images/1_32.jpg',\n", + " 'images/1_33.jpg',\n", + " 'images/1_34.jpg',\n", + " 'images/1_35.jpg',\n", + " 'images/1_36.jpg',\n", + " 'images/1_37.jpg',\n", + " 'images/1_38.jpg',\n", + " 'images/1_39.jpg',\n", + " 'images/1_4.jpg',\n", + " 'images/1_40.jpg',\n", + " 'images/1_41.jpg',\n", + " 'images/1_42.jpg',\n", + " 'images/1_43.jpg',\n", + " 'images/1_44.jpg',\n", + " 'images/1_45.jpg',\n", + " 'images/1_46.jpg',\n", + " 'images/1_47.jpg',\n", + " 'images/1_48.jpg',\n", + " 'images/1_49.jpg',\n", + " 'images/1_5.jpg',\n", + " 'images/1_51.jpg',\n", + " 'images/1_6.jpg',\n", + " 'images/1_7.jpg',\n", + " 'images/1_8.jpg',\n", + " 'images/1_9.jpg',\n", + " 'images/2_1.jpg',\n", + " 'images/2_10.jpg',\n", + " 'images/2_12.jpg',\n", + " 'images/2_13.jpg',\n", + " 'images/2_14.jpg',\n", + " 'images/2_15.jpg',\n", + " 'images/2_17.jpg',\n", + " 'images/2_18.jpg',\n", + " 'images/2_19.jpg',\n", + " 'images/2_2.jpg',\n", + " 'images/2_20.jpg',\n", + " 'images/2_21.jpg',\n", + " 'images/2_22.jpg',\n", + " 'images/2_23.jpg',\n", + " 'images/2_24.jpg',\n", + " 'images/2_26.jpg',\n", + " 'images/2_27.jpg',\n", + " 'images/2_28.jpg',\n", + " 'images/2_29.jpg',\n", + " 'images/2_3.jpg',\n", + " 'images/2_30.jpg',\n", + " 'images/2_31.jpg',\n", + " 'images/2_32.jpg',\n", + " 'images/2_33.jpg',\n", + " 'images/2_34.jpg',\n", + " 'images/2_35.jpg',\n", + " 'images/2_36.jpg',\n", + " 'images/2_37.jpg',\n", + " 'images/2_38.jpg',\n", + " 'images/2_39.jpg',\n", + " 'images/2_4.jpg',\n", + " 'images/2_40.jpg',\n", + " 'images/2_41.jpg',\n", + " 'images/2_42.jpg',\n", + " 'images/2_43.jpg',\n", + " 'images/2_44.jpg',\n", + " 'images/2_5.jpg',\n", + " 'images/2_6.jpg',\n", + " 'images/2_7.jpg',\n", + " 'images/2_8.jpg',\n", + " 'images/2_9.jpg',\n", + " 'images/3_10.jpg',\n", + " 'images/3_11.jpg',\n", + " 'images/3_12.jpg',\n", + " 'images/3_13.jpg',\n", + " 'images/3_14.jpg',\n", + " 'images/3_15.jpg',\n", + " 'images/3_16.jpg',\n", + " 'images/3_17.jpg',\n", + " 'images/3_18.jpg',\n", + " 'images/3_19.jpg',\n", + " 'images/3_20.jpg',\n", + " 'images/3_21.jpg',\n", + " 'images/3_22.jpg',\n", + " 'images/3_23.jpg',\n", + " 'images/3_25.jpg',\n", + " 'images/3_26.jpg',\n", + " 'images/3_27.jpg',\n", + " 'images/3_28.jpg',\n", + " 'images/3_29.jpg',\n", + " 'images/3_3.jpg',\n", + " 'images/3_30.jpg',\n", + " 'images/3_31.jpg',\n", + " 'images/3_32.jpg',\n", + " 'images/3_34.jpg',\n", + " 'images/3_38.jpg',\n", + " 'images/3_40.jpg',\n", + " 'images/3_42.jpg',\n", + " 'images/3_43.jpg',\n", + " 'images/3_44.jpg',\n", + " 'images/3_45.jpg',\n", + " 'images/3_46.jpg',\n", + " 'images/3_47.jpg',\n", + " 'images/3_48.jpg',\n", + " 'images/3_49.jpg',\n", + " 'images/3_5.jpg',\n", + " 'images/3_50.jpg',\n", + " 'images/3_51.jpg',\n", + " 'images/3_52.jpg',\n", + " 'images/3_53.jpg',\n", + " 'images/3_55.jpg',\n", + " 'images/3_56.jpg',\n", + " 'images/3_57.jpg',\n", + " 'images/3_58.jpg',\n", + " 'images/3_59.jpg',\n", + " 'images/3_65.jpg',\n", + " 'images/3_66.jpg',\n", + " 'images/3_7.jpg',\n", + " 'images/3_71.jpg',\n", + " 'images/3_72.jpg',\n", + " 'images/3_73.jpg',\n", + " 'images/3_74.jpg',\n", + " 'images/3_75.jpg',\n", + " 'images/3_76.jpg',\n", + " 'images/3_77.jpg',\n", + " 'images/3_78.jpg',\n", + " 'images/3_8.jpg',\n", + " 'images/3_9.jpg',\n", + " 'images/4_10.jpg',\n", + " 'images/4_11.jpg',\n", + " 'images/4_13.jpg',\n", + " 'images/4_14.jpg',\n", + " 'images/4_21.jpg',\n", + " 'images/4_6.jpg',\n", + " 'images/4_7.jpg',\n", + " 'images/4_9.jpg',\n", + " 'images/5_1.jpg',\n", + " 'images/5_2.jpg',\n", + " 'images/5_3.jpg',\n", + " 'images/5_4.jpg',\n", + " 'images/5_5.jpg',\n", + " 'images/5_6.jpg']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import re\n", + "import numpy as np\n", + "import os\n", + "import cv2\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.rcParams['font.sans-serif'] = ['SimHei']\n", + "plt.rcParams['axes.unicode_minus'] = False\n", + "\n", + "def getimgnames(path=None):\n", + " \"\"\"\n", + " 获取指定文件夹中的JPG图片名称(含路径)\n", + " :param path: 指定文件夹\n", + " :return: path中的所有JPG图片名称(含路径,例如:./path/image1.jpg)\n", + " \"\"\"\n", + " imgnames = []\n", + " filenames = os.listdir(path) # 获取path中的所有文件名\n", + " for i in filenames:\n", + " if re.findall('\\.jpg$', i) != []: # 在所有文件名中找出JPG图片名称\n", + " imgnames.append(os.path.join(path, i)) # 将图片名称和路径合并、保存\n", + " return imgnames\n", + "\n", + "imglist = getimgnames('images/')\n", + "imglist" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "43738e00-e1fa-4d6f-b08c-1e64662a5ce0", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\ndef cut_image(img, imgFile):\\n cx = int(np.size(img, 1))/2\\n cy = int(np.size(img, 0))/2\\n \\n plt.figure(figsize=(8,8))\\n plt.imshow(img)\\n\\n plt.plot([cx-50, cx+50], [cy+50, cy+50], \\'r\\', linewidth=2)\\n plt.plot([cx+50, cx+50], [cy-50, cy+50], \\'r\\', linewidth=2)\\n plt.plot([cx-50, cx+50], [cy-50, cy-50], \\'r\\', linewidth=2)\\n plt.plot([cx-50, cx-50], [cy-50, cy+50], \\'r\\', linewidth=2)\\n plt.annotate(\\'选取的水样窗口\\', xy=(cx+50,cy-50), xytext=(cx+300, cy-300),\\n arrowprops=dict(facecolor=\\'black\\', shrink=0.1))\\n\\n plt.title(\\'水色样本 \\'+imgFile+\\' 分辨率为\\'+str(img.size)+\" 类别标签 \"+str(imgFile[9]))\\n plt.show()\\n \\nfor i in range(len(imglist)):\\n img = cv2.imread(imglist[i])\\n cut_image(img, imglist[i])\\n'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "def cut_image(img, imgFile):\n", + " cx = int(np.size(img, 1))/2\n", + " cy = int(np.size(img, 0))/2\n", + " \n", + " plt.figure(figsize=(8,8))\n", + " plt.imshow(img)\n", + "\n", + " plt.plot([cx-50, cx+50], [cy+50, cy+50], 'r', linewidth=2)\n", + " plt.plot([cx+50, cx+50], [cy-50, cy+50], 'r', linewidth=2)\n", + " plt.plot([cx-50, cx+50], [cy-50, cy-50], 'r', linewidth=2)\n", + " plt.plot([cx-50, cx-50], [cy-50, cy+50], 'r', linewidth=2)\n", + " plt.annotate('选取的水样窗口', xy=(cx+50,cy-50), xytext=(cx+300, cy-300),\n", + " arrowprops=dict(facecolor='black', shrink=0.1))\n", + "\n", + " plt.title('水色样本 '+imgFile+' 分辨率为'+str(img.size)+\" 类别标签 \"+str(imgFile[9]))\n", + " plt.show()\n", + " \n", + "for i in range(len(imglist)):\n", + " img = cv2.imread(imglist[i])\n", + " cut_image(img, imglist[i])\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "65b2b8b6-ed00-47ff-84f1-e22f97d48cdb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# 加载图像统计信息模块(注:也可以直接通过颜色通道来计算)\n", + "from PIL import ImageStat,Image\n", + "\n", + "# 遍历全体图像进行快速检查\n", + "size = 100\n", + "imgPath = './images'\n", + "imgWidth = [] # 图像宽度\n", + "imgHeight = [] # 图像高度\n", + "imgRrange = [] # 图像红色通道极差\n", + "imgGrange = [] # 图像绿色通道极差\n", + "imgBrange = [] # 图像蓝色通道极差\n", + "\n", + "newImgs = [] # 获得选取后的图像作为模型训练和验证数据\n", + "\n", + "imgFiles = os.listdir(imgPath)\n", + "for imgFile in imgFiles:\n", + " img = Image.open(os.path.join(imgPath,imgFile))\n", + " imgWidth.append(img.size[0])\n", + " imgHeight.append(img.size[1])\n", + " \n", + " # 获得图像中心区域大小为size的图像块\n", + " cx, cy = (int(i/2) for i in img.size)\n", + " box = (cx-50, cy-50, cx+50, cy+50)\n", + " region = img.crop(box)\n", + " \n", + " # 计算选取图像块的标准差 分为红绿蓝三种\n", + " stat = ImageStat.Stat(region)\n", + " imgRrange.append(stat.extrema[0][1]-stat.extrema[0][0])\n", + " imgGrange.append(stat.extrema[1][1]-stat.extrema[1][0])\n", + " imgBrange.append(stat.extrema[2][1]-stat.extrema[2][0])\n", + " \n", + " newImgs.append(region)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "527d76c9-7201-4fe6-a835-3a329fb90bc7", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 161 entries, 0 to 160\n", + "Data columns (total 9 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 0 161 non-null float64\n", + " 1 1 161 non-null float64\n", + " 2 2 161 non-null float64\n", + " 3 3 161 non-null float64\n", + " 4 4 161 non-null float64\n", + " 5 5 161 non-null float64\n", + " 6 6 161 non-null float64\n", + " 7 7 161 non-null float64\n", + " 8 8 161 non-null float64\n", + "dtypes: float64(9)\n", + "memory usage: 11.4 KB\n" + ] + }, + { + "data": { + "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", + "
012345678
0148.6037138.639664.36873.6330774.12833010.4990464.2543404.80291412.057685
1163.6769145.547054.46083.9343502.8401743.5025514.4534993.2451414.065518
2153.9430147.083471.96012.2256571.8109793.1366082.6443402.1487263.651915
3150.3724151.398264.31642.0373801.5215902.7280932.3757801.8196923.173392
4150.7381150.977464.62041.9186741.6652603.1109012.2599151.9588153.619921
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4 5 6 \\\n", + "0 148.6037 138.6396 64.3687 3.633077 4.128330 10.499046 4.254340 \n", + "1 163.6769 145.5470 54.4608 3.934350 2.840174 3.502551 4.453499 \n", + "2 153.9430 147.0834 71.9601 2.225657 1.810979 3.136608 2.644340 \n", + "3 150.3724 151.3982 64.3164 2.037380 1.521590 2.728093 2.375780 \n", + "4 150.7381 150.9774 64.6204 1.918674 1.665260 3.110901 2.259915 \n", + "\n", + " 7 8 \n", + "0 4.802914 12.057685 \n", + "1 3.245141 4.065518 \n", + "2 2.148726 3.651915 \n", + "3 1.819692 3.173392 \n", + "4 1.958815 3.619921 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "# 构建训练数据集和分类标签\n", + "data = []\n", + "dy = []\n", + "for i, img in enumerate(newImgs):\n", + " r, g, b = np.split(np.array(img), 3, axis = 2)\n", + " \n", + " #计算一阶矩\n", + " r_m1 = np.mean(r)\n", + " g_m1 = np.mean(g)\n", + " b_m1 = np.mean(b)\n", + " \n", + " #二阶矩\n", + " r_m2 = np.std(r)\n", + " g_m2 = np.std(g)\n", + " b_m2 = np.std(b)\n", + " \n", + " #三阶矩\n", + " r_m3 = np.mean(abs(r - r.mean())**3)**(1/3)\n", + " g_m3 = np.mean(abs(g - g.mean())**3)**(1/3)\n", + " b_m3 = np.mean(abs(b - b.mean())**3)**(1/3)\n", + " \n", + " # 构造新数据集\n", + " df = np.array([r_m1,g_m1,b_m1,r_m2,g_m2,b_m2,r_m3,g_m3,b_m3])\n", + " data.append(df)\n", + " \n", + " # 保存对应的分类标签\n", + " dy.append(int(imgFiles[i][0]))\n", + "\n", + "dy = np.array(dy)\n", + "data = pd.DataFrame(np.array(data))\n", + "data.info()\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "208d30d2-1850-45eb-a68d-94e44a5f59eb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "((128, 9), (33, 9), (128,))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "x_train,x_test,y_train,y_test=train_test_split(data,dy,test_size=0.2,random_state=0)\n", + "x_train.shape,x_test.shape,y_train.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "726c20cb-1065-4f7e-9d71-39e261178fd6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.3939393939393939\n" + ] + } + ], + "source": [ + "from sklearn.metrics import accuracy_score\n", + "from sklearn.neural_network import MLPClassifier\n", + "mlp=MLPClassifier()\n", + "mlp.fit(x_train,y_train)\n", + "y_pred=mlp.predict(x_test)\n", + "print(accuracy_score(y_pred,y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51804510-c0a3-4a51-9795-0e38a7c9a8f4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "419b9b44-bcd3-499f-8307-cb9f72ef52b3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/购物评论 情感分类/泰坦尼克.ipynb b/购物评论 情感分类/泰坦尼克.ipynb new file mode 100644 index 0000000..5c89f75 --- /dev/null +++ b/购物评论 情感分类/泰坦尼克.ipynb @@ -0,0 +1,698 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "e53fa4f2-4529-4db9-affe-3075c1a251ec", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "plt.rcParams['font.family'] = ['serif', 'SimSun']\n", + "plt.rcParams['mathtext.fontset'] = 'cm'" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "69d54897-4b78-418f-940f-ec075be5a62b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassAgeSibSpParchFare
count891.000000891.000000891.000000714.000000891.000000891.000000891.000000
mean446.0000000.3838382.30864229.6991180.5230080.38159432.204208
std257.3538420.4865920.83607114.5264971.1027430.80605749.693429
min1.0000000.0000001.0000000.4200000.0000000.0000000.000000
25%223.5000000.0000002.00000020.1250000.0000000.0000007.910400
50%446.0000000.0000003.00000028.0000000.0000000.00000014.454200
75%668.5000001.0000003.00000038.0000001.0000000.00000031.000000
max891.0000001.0000003.00000080.0000008.0000006.000000512.329200
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass Age SibSp \\\n", + "count 891.000000 891.000000 891.000000 714.000000 891.000000 \n", + "mean 446.000000 0.383838 2.308642 29.699118 0.523008 \n", + "std 257.353842 0.486592 0.836071 14.526497 1.102743 \n", + "min 1.000000 0.000000 1.000000 0.420000 0.000000 \n", + "25% 223.500000 0.000000 2.000000 20.125000 0.000000 \n", + "50% 446.000000 0.000000 3.000000 28.000000 0.000000 \n", + "75% 668.500000 1.000000 3.000000 38.000000 1.000000 \n", + "max 891.000000 1.000000 3.000000 80.000000 8.000000 \n", + "\n", + " Parch Fare \n", + "count 891.000000 891.000000 \n", + "mean 0.381594 32.204208 \n", + "std 0.806057 49.693429 \n", + "min 0.000000 0.000000 \n", + "25% 0.000000 7.910400 \n", + "50% 0.000000 14.454200 \n", + "75% 0.000000 31.000000 \n", + "max 6.000000 512.329200 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_base = pd.read_csv(\"train.csv\")\n", + "df = df_base.copy()\n", + "df.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3ef51cf7-195f-4fc2-8700-1d047e668710", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\LE\\AppData\\Local\\Temp\\ipykernel_4260\\58784124.py:10: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[col] = encoder.fit_transform(df[col])\n", + "C:\\Users\\LE\\AppData\\Local\\Temp\\ipykernel_4260\\58784124.py:10: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df[col] = encoder.fit_transform(df[col])\n", + "C:\\Users\\LE\\AppData\\Local\\Temp\\ipykernel_4260\\58784124.py:12: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " df['Age'] = df['Age'].fillna(int(df['Age'].mean()))\n" + ] + }, + { + "data": { + "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", + " \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", + "
PclassSexAgeSibSpParchFareEmbarked
03122.0107.25002
11038.01071.28330
23026.0007.92502
31035.01053.10002
43135.0008.05002
........................
8862127.00013.00002
8871019.00030.00002
8883029.01223.45002
8891126.00030.00000
8903132.0007.75001
\n", + "

891 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " Pclass Sex Age SibSp Parch Fare Embarked\n", + "0 3 1 22.0 1 0 7.2500 2\n", + "1 1 0 38.0 1 0 71.2833 0\n", + "2 3 0 26.0 0 0 7.9250 2\n", + "3 1 0 35.0 1 0 53.1000 2\n", + "4 3 1 35.0 0 0 8.0500 2\n", + ".. ... ... ... ... ... ... ...\n", + "886 2 1 27.0 0 0 13.0000 2\n", + "887 1 0 19.0 0 0 30.0000 2\n", + "888 3 0 29.0 1 2 23.4500 2\n", + "889 1 1 26.0 0 0 30.0000 0\n", + "890 3 1 32.0 0 0 7.7500 1\n", + "\n", + "[891 rows x 7 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cols = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']\n", + "df = df_base[cols]\n", + "y = df_base['Survived']\n", + "\n", + "from sklearn.preprocessing import LabelEncoder\n", + "label_encoders = {}\n", + "for col in cols:\n", + " if df[col].dtype == 'object':\n", + " encoder = LabelEncoder()\n", + " df[col] = encoder.fit_transform(df[col])\n", + " label_encoders[col] = encoder\n", + "df['Age'] = df['Age'].fillna(int(df['Age'].mean()))\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "35670fc9-8bef-4d34-8499-7efb66e4d14d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "std_scaler = StandardScaler()\n", + "X = std_scaler.fit_transform(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "fa90635f-3899-4fd2-86f5-1125a13942c8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test = train_test_split(X, test_size=0.3, random_state=42)\n", + "y_train, y_test = train_test_split(y, test_size=0.3, random_state=42)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2f01cec1-bed4-481f-814c-930f2da56d55", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'SGD': 0.7625290322580646, 'tree': 0.7737290322580646, 'kneighbor': 0.7913032258064516, 'forest': 0.7898451612903227, 'svc': 0.8234193548387096, 'log': 0.7993161290322581}\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import cross_val_score\n", + "from sklearn.linear_model import SGDClassifier\n", + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.svm import SVC\n", + "from sklearn.linear_model import LogisticRegression\n", + "models = {}\n", + "fold_scores = {}\n", + "sgd = SGDClassifier(); models['sgd'] = sgd\n", + "fold_scores['SGD'] = np.mean(cross_val_score(sgd, X_train, y_train))\n", + "tree = DecisionTreeClassifier(); models['tree'] = tree\n", + "fold_scores['tree'] = np.mean(cross_val_score(tree, X_train, y_train))\n", + "kneighbor = KNeighborsClassifier(); models['kneighbor'] = kneighbor\n", + "fold_scores['kneighbor'] = np.mean(cross_val_score(kneighbor, X_train, y_train))\n", + "forest = RandomForestClassifier(); models['forest'] = forest\n", + "fold_scores['forest'] = np.mean(cross_val_score(forest, X_train, y_train))\n", + "svc = SVC(); models['svc'] = svc\n", + "fold_scores['svc'] = np.mean(cross_val_score(svc, X_train, y_train))\n", + "logistic = LogisticRegression(); models['log'] = logistic\n", + "fold_scores['log'] = np.mean(cross_val_score(logistic, X_train, y_train))\n", + "print(fold_scores)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "08243392-e962-4a6b-8b0d-90c01c60d15c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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ERERUd0xKjQUFBQAANRqtaxcrVZL86oihMCiRYuwcOFCPPHEEzVqc8mSJbCzs5NeTk5OxgyFiIiIjGRUaLCxsQFw/1/5D9Lr9dK8qoSGhuLJJ5/EG2+8UeM258+fj5ycHOl15coVxeMgIiIi41kYU9nBwQF2dnbIyMiQlWdkZKB9+/ZVLrtu3TqcPHkS3377ba20qVary+2dICIiorpj9ImQPj4+iIuLk6aFEDh16hR8fX0rXWbHjh3YuXMn9uzZAysrKyQnJ8tOcjSlTSIiIqpfRoeGkJAQHDp0CBcuXAAAhIeHw9zcHEFBQQCA4OBgjB8/Xqp/4MABhISE4N1330V8fDzi4uLwww8/ICYmRnGbRERE1PCMOjwBAL169UJYWBgCAwNhbW0NlUqFiIgI2NraAgAKCwthMBik+sHBwcjKyoKPj4+snQULFihuk4iIiBqe0aEBAAICAhAQEFDhvB07dsimb968WeM2iYiIqOHxgVVERESkCEMDERERKcLQQERERIowNBAREZEiDA1ERESkCEMDERERKcLQQERERIowNBAREZEiDA1ERESkCEMDERERKcLQQERERIowNBAREZEiDA1ERESkCEMDERERKcLQQERERIowNBAREZEiDA1ERESkCEMDERERKcLQQERERIowNBAREZEiDA1ERESkCEMDERERKcLQQERERIowNBAREZEiDA1ERESkCEMDERERKcLQQERERIowNBAREZEiJoWGvXv3wsPDA97e3tBqtYiPj6+yfmlpKT777DNYW1vjyJEj5eaHhoaiR48e0Ol00mvkyJGmdI2IiIjqiIWxC8TGxmLChAmIi4uDRqPBli1b4Ofnh4SEBNja2parf/v2bYwaNQodOnRAYWFhpe2uWLECOp3O2O4QERFRPTF6T8PSpUvh7+8PjUYDABg3bhyKi4sRFhZWYf27d+9i6dKleOutt2rWUyIiImpQRoeGqKgoeHp6/tmASoWePXsiMjKywvpt27aFh4eH6T0kIiKivwSjQkN2djZycnLg6OgoK3d0dERycnKNOrJx40bodDr069cPQUFBSEpKqlF7REREVLuMCg0FBQUAALVaLStXq9XSPFM4OzvD3d0dkZGROHbsGNq1a4eePXvi2rVrlS6j1+uRm5srexEREVHdMSo02NjYALj/B/tBer1emmeKSZMmYfbs2bCw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pHB3dxc9evSol22hus+9pr9l169fF6NGjZK2mddee03o9XohhBAzZ84UrVq1Eq1atRJz5swRiYmJonfv3rLvUGVOnDgh1W3fvr3o3bu37GVlZSV+++03WXvx8fFi/Pjx0ue4bNkyER4eLjQajVCr1UKr1YrExETp/Vi+fLkYMmRIhZ/H2bNnRf/+/YVGoxEjRowQc+fOlfX7wbGVXVFX9n6Utd+9e3fx3XffiUWLFgkHBwdha2srRowYIYS4fyXOq6++KjQajdDpdGLYsGGyK1YMBoOYPn26cHJyEgMHDhQhISFiwIAB0vZZm/hobKJ6cPv2bTRr1kw6pllaWorHHnsMkZGR6NevXwP3jv5qzMzM8OOPP8pOGib6K+DhCaJ6sHjxYmzbtk2a3rBhA5ydneHp6dmAvSIiMg5DA1E98PX1xbp166DT6dC/f3/s378fBw4ckO6sSAT8eUdI4P6dAffu3duwHSJ6CA9PEBERkSLc00BERESKMDQQERGRIgwNREREpAhDAxERESnC0EBERESKMDQQERGRIgwNREREpAhDAxERESnC0EBERESK/H9pV7aXQpj/5QAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "forest.fit(X_train, y_train)\n", + "importances = np.asarray(sorted(zip(forest.feature_importances_, cols), key=lambda x: x[0], reverse=True))\n", + "plt.figure(figsize=(6,3))\n", + "plt.bar(importances[:,1], importances[:,0].astype('float32'), label='重要度')\n", + "plt.title(\"参数重要度\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ad208a89-4068-41d0-9c3a-359f77897370", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sgd训练集准确率: 0.68240, 测试集准确率: 0.73874\n", + "tree训练集准确率: 0.99539, 测试集准确率: 0.69811\n", + "kneighbor训练集准确率: 0.83902, 测试集准确率: 0.79348\n", + "forest训练集准确率: 0.98643, 测试集准确率: 0.76699\n", + "svc训练集准确率: 0.86486, 测试集准确率: 0.84444\n", + "log训练集准确率: 0.74882, 测试集准确率: 0.80198\n" + ] + } + ], + "source": [ + "from sklearn.metrics import precision_score\n", + "for name, model in models.items():\n", + " model.fit(X_train, y_train)\n", + " train_pred = model.predict(X_train)\n", + " print(name+\"训练集准确率:\", f\"{precision_score(y_train, train_pred):.5f}\", end=', ')\n", + " test_pred = model.predict(X_test)\n", + " print(\"测试集准确率:\", f\"{precision_score(y_test, test_pred):.5f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "267d9096-cbf6-4180-99ae-352c4a549371", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0UAAAGbCAYAAAALLDvDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABaCUlEQVR4nO3de5xN9f7H8feeu3EZUxi55FLuw7iTKTO5ljgVKiHX06EmuSSZLghzhuMuitLFrURJyKkIp0gJlSTkMsllGGIYwx4ze/3+8LNrZzAze9trz6zX8zzW47TX97vXfJfjzLvPWt/1XTbDMAwBAAAAgEX5mT0AAAAAADATRREAAAAAS6MoAgAAAGBpFEUAAAAALI2iCAAAAIClURQBAAAAsDSKIgAAAACWRlEEAAAAwNIoigAAAABYGkURAAAAAEujKAIAeM2PP/6oLl26qHbt2qpbt67q1KmjJk2aaNCgQdq6dat69OihUqVKyWazqVKlSnrhhReuOEarVq1UokQJlStXTsOHD3fut9vtmj59uqKjo1WvXj3VqVNHderU0YMPPqg5c+YoOTnZm6cKAMhHAsweAADAGn766Sc1bdpUcXFxmjdvnoKCgiRJq1ev1gMPPKAiRYpo3rx5WrZsmR588EE98MADSkhIuOI4a9asUd26dfXmm2+qQYMGkqRjx46pXbt2Cg8P18KFC1WxYkVJUlpamiZOnKjHH39cMTExWr9+vbdOFwCQj9gMwzDMHgQAoOAbOnSoJk2apNOnTyssLMyl7emnn1axYsU0duxYZWZmqly5csrMzNSRI0ecxdNlW7duVd++ffXDDz8498XExOi3337Tzp07FRoaesXP7t27tw4cOEBRBADIFtPnAABekZmZKUlKSkq6oi0hIUFDhw6VJAUEBOixxx7TyZMn9fHHH1/R980331Tfvn2dnz/99FN9+eWX6t+/f7YFkSQNHDhQLVq08MBZAAAKIooiAIBXtGrVSpJ0//3366233tKZM2ecbUWLFlXx4sWdny8XPW+++abLMc6fP6+lS5eqW7duzn0rVqyQJDVr1uyqP7tu3boaMWKE2+cAACiYKIoAAF7Rvn17JSYm6tixY+rbt69KlCihli1b6rXXXlNqaqpL3+rVq+uOO+7Q6tWrdfDgQef+Dz/8UHfffbduuukm574DBw5IkkqXLu2dEwEAFDgURQAArxk+fLiOHDmiWbNmqU2bNtq0aZOefPJJ3XbbbVq3bp1L3759+8rhcOidd95x7vv71DkAADyBoggA4FXh4eHq16+fVq5cqZSUFM2YMUNpaWnq0aOHS79HHnlERYoU0dtvvy3DMLRv3z799ttvatmypUu/SpUqSRJLbgMA8oyiCADgFVu2bNG3337rsq9w4cKKi4vTY489pkOHDun48ePOtiJFiuihhx5SUlKSvvjiC7311lvq1auXbDabyzHat28vSdq0adNVf/b+/fv1+eefiwVXAQDZoSgCAHjFypUrNXny5Gzb/P39FRQUpGLFirnsvzxV7vXXX9f8+fPVq1evK7577733qkWLFpo9e7bOnz9/RbthGOratatee+21KwoqAAAkiiIAgBd9+OGHev/9913u2Hz22WdasGCB+vXrp5CQEJf+0dHRql69upYsWaKaNWvq1ltvzfa4ixcv1s0336z7779fv/32m3N/SkqKevbsqRMnTmjatGk35qQAAPkeL28FAHjF7t27tWDBAq1du1anT59WQECAzpw5oxIlSqh79+566qmn5O/vf8X3JkyYoGHDhmnx4sV66KGHrnp8u92uV199Ve+9954uXLggP79L1/06dOiggQMHqkSJEjfs3AAA+RtFEQAAAABLY/ocAAAAAEujKAIAAABgaRRFAAAAACyNoggAAACApVEUAQAAALA0iiIAAAAAlhZg9gDg+ypWrKjQ0FAFBQVJktLS0rRv3z6VL19eN910kyQpIyND6enpSkpK8tjPXbZsmXr16qU1a9aoYcOGbh/v/PnzuuOOO5ScnKxjx46pRo0aCgoK0sWLF+VwONSsWTP961//UpMmTfL8M6ZOnaqKFSvqgQcecHu87ho1apRiY2MVGxtr9lAA4IYzI6tOnz6tqVOn6oEHHlDdunWv2ZcMAnycAVxHhQoVjAMHDjg/r1u3zpBkvP322859Bw4cMCpUqODRn/vFF18YderUMX7++WePHnfkyJGGJJdzOn78uPH8888b/v7+xoABAwyHw5GnY1eoUMHo2bOnZwbqJknGyJEjzR4GAHiFGVl14MCBK37G9ZBBgG/iThGuKyYmRoUKFbpmn0KFCikmJsajP7dFixb68ccfPXrMqylZsqQSEhJUqVIlPf7447r55ps1cuRIr/xsAID7zMoqTyCDAPPxTBGua+7cuYqIiLhmn4iICM2dO1cLFy5U3bp1ZbPZNGLECI0aNUrNmjVTWFiYihcvLkn64Ycf1LVrV0VFRalevXqqW7euxowZo4yMDOfxZs6cqZo1a8pms+mdd96RJK1bt05169ZVUFCQevXqpVdeeUV33nmnypYtqw4dOig5Odntc/3nP/+p2rVra/z48frjjz+c+xMTE9WkSRM1bNhQUVFRatu2rbZt2+Zs3717t+rWrasjR45o+fLlqlu3rurWrat58+bl+Jwl6bvvvlOrVq1Ut25d1atXT9HR0ZowYYJLnzNnzujpp59WxYoVVb16ddWqVUuvvvqqs/3yn5MkzZo1yzmWNWvWuP3nAwC+KjdZJUkLFy5UVFSUqlatqooVK6pv3746ceKES/93331XDRs2VP369VWnTh21b99ey5Ytc36/Xbt2kqQRI0Y4f9fu3Lkzz+dABgEmMvtWFfKf7KYk/J0ko0yZMsaKFSsMwzCM/fv3G+Hh4YZhGEZiYqLRpUsXw263G4ZhGCdPnjTuuOMOY8iQIS7HuNq0hAoVKhhlypQxFixYYBiGYfzxxx9G5cqVjcceeyxH489u6sJfPffcc4YkY8mSJc59xYoVM7777jvn53fffdcoVqyYcejQoSvGlt3UhZyc89mzZ42bbrrJePPNN537PvzwQ+Ov/zfNyMgw7rjjDqNmzZrGsWPHDMMwjG+++cYoVKiQMW7cOJefKaYuALCwa2XVjBkzDJvNZixfvtwwjEu/f5s3b25ERUU5f09v2LDBCAoKMn755RfDMAwjMzPTGDRokBETE+M8jqemz/0VGQSYgztFuGEiIyPVvn17SVKlSpX0zTffSJJ69eql1157zfkw7E033aQePXpo9uzZMgwjR8cuXry4unXrJkkKDw9X27Zt9cUXX3hk3BUqVJAkHThwwLnv22+/dVns4dFHH1WhQoX07rvv5uiYOTnnXbt26Y8//lC1atWc3+vYsaOef/555+eFCxdq06ZNGjVqlEqVKiVJatKkiR599FElJCQoPT09j2cNANZw9uxZxcfH695771WHDh0kSUWKFNHYsWP1448/6v3335ckbdq0SSEhIc5M8Pf317Bhw9S5c+cbOj4yCDAHRRFumMjISJfPVatWlXSpoHn99dfVrFkz1a5dW3Xr1tW///1vnTt3LsdT4GrUqOHyuUSJEh6ZPvdXNpvN+c/nzp3Tww8/rDp16jinAvzxxx/au3dvjo6Vk3OuXr26ypQpo/vvv18vvfSS83mqhIQE53E+++wzSdKdd97pcvzatWvr7Nmz+u6779w6ZwAo6L7++mudPXs229+jkrR27VpJl55RSk9PV8OGDTVjxgwdOnRIt9xyi5566imvjJMMAryLhRZwwxQtWjTb/f/85z/13//+V2vWrFG9evUkSe+884569+4tu92eo2MXKVLE5bOfn58cDod7A/5/v/32m6RLy7tK0k8//aQ777xTvXv31nfffafg4GBne07Hm5NzLlKkiL777jv95z//0ezZszV27FhVrVpVL730krp37y5Jzvnu9957r8vxz58/r4iICJ06dcq9kweAAu7y79HXXnvNeVfosoiICF24cEGS1KhRI3399deaOHGinn32WQ0YMEDNmzfXxIkT1ahRoxs2PjIIMAdFEbzq/PnzWrRokfr37+/8xexrPvnkE4WGhqply5aSpEWLFunChQsaPXq0M4xyIzfnXKZMGU2dOlUTJ07U559/rrFjx+qxxx7TLbfcopYtW6pEiRKSpP/9738KCwvL/ckBgMVd/j36zDPPaODAgdfs26hRI73//vs6e/asFi9erFGjRqlVq1ZKSkpSeHj4DRkfGQSYg+lz8KrMzExlZWXJz8/1r97Ro0dNGpGr2bNna8eOHXr++eedgXf5Ktpfx5yVlaXjx49f8f3AwEDn/OyUlBStWbMmx+f8008/OacpBAQEqF27dlq5cqUkOacxtG3bVpL0/fffu3w3NTVVHTt2dFmtKCAgwDmW3377TV9//XVu/igAoEBq1qyZihQpcsXvUUkaO3asPvzwQ0mXVp5bvny5pEszH/r27atp06bpzJkzzud9AgMDJcn5u/aXX37RDz/8kOexkUGAeSiK4FVFixZVbGys3n//fe3fv1+S9Pvvv2vWrFmmjuv48eN64YUXFBcXp0GDBrk8WHr5Qdxx48Y5f8H/+9//1vnz5684TqVKlXTo0CFJ0tKlS/Xvf/87x+d88uRJTZo0yWU513Xr1ikgIMD5RvBu3brpjjvu0LBhw5yBeP78eQ0cOFABAQHOt7b/fSyzZs3SnDlz3PozAoCCoGjRokpMTNR7773nfEZGkpYvX64ZM2aocePGkqQ9e/YoMTHROSXM4XDoyy+/VJkyZVSzZk1Jl6bbFSpU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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import confusion_matrix\n", + "plt.figure(figsize=(10,4))\n", + "plt.subplot(121)\n", + "train_pred = svc.predict(X_train)\n", + "confuse_mat = confusion_matrix(y_train, train_pred)\n", + "sns.heatmap(confuse_mat, annot=True, fmt=\".0f\")\n", + "plt.ylabel('True')\n", + "plt.xlabel('Predict')\n", + "plt.title(\"Train Dataset\")\n", + "plt.subplot(122)\n", + "test_pred = svc.predict(X_test)\n", + "confuse_mat = confusion_matrix(y_test, test_pred)\n", + "sns.heatmap(confuse_mat, annot=True, fmt=\".0f\")\n", + "plt.ylabel('True')\n", + "plt.xlabel('Predict')\n", + "plt.title(\"Test Dataset\")\n", + "plt.suptitle(\"SVC\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "781bd084-7700-4c56-9be7-c3ad3f579bd5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import roc_curve\n", + "fpr, tpr, thresholds = roc_curve(y_train, train_pred)\n", + "plt.plot(fpr, tpr)\n", + "plt.plot([0,1],[0,1],'m--')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8cb92d20-41b7-417b-a6e2-226ebb9c686b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "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", + "
Survived
Embarked
C0.553571
Q0.389610
S0.336957
\n", + "
" + ], + "text/plain": [ + " Survived\n", + "Embarked \n", + "C 0.553571\n", + "Q 0.389610\n", + "S 0.336957" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df1 = df_base.copy()\n", + "df_base[['Embarked', 'Survived']].groupby(['Embarked']).mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "999fa9d2-f9eb-4671-aed3-b17aa4158e16", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/购物评论 情感分类/短信.ipynb b/购物评论 情感分类/短信.ipynb new file mode 100644 index 0000000..df39bfd --- /dev/null +++ b/购物评论 情感分类/短信.ipynb @@ -0,0 +1,176 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "9d091a01", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import re\n", + "import jieba\n", + "import pickle\n", + "from wordcloud import WordCloud\n", + "from sklearn.naive_bayes import GaussianNB\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer\n", + "from sklearn.metrics import confusion_matrix\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams['font.sans-serif'] = 'SimHei'\n", + "plt.rcParams['axes.unicode_minus'] = False\n", + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eff92c98", + "metadata": {}, + "outputs": [], + "source": [ + "def data_process(file='message80W1.csv'):\n", + "#读取数据并进行清洗\n", + " data = pd.read_csv(file, header=None, index_col=0)\n", + " data.columns = ['label', 'message']\n", + " n = 5000\n", + "\n", + " a = data[data['label'] == 0].sample(n)\n", + " b = data[data['label'] == 1].sample(n)\n", + " data_new = pd.concat([a, b], axis=0)\n", + "\n", + " data_dup = data_new['message'].drop_duplicates()\n", + " data_qumin = data_dup.apply(lambda x: re.sub('x', '', x))\n", + "\n", + " jieba.load_userdict('newdic1.txt')\n", + " data_cut = data_qumin.apply(lambda x: jieba.lcut(x))\n", + "\n", + " stopWords = pd.read_csv('stopword.txt', encoding='GB18030', sep='hahaha', header=None)\n", + " stopWords = ['≮', '≯', '≠', '≮', ' ', '会', '月', '日', '–'] + list(stopWords.iloc[:, 0])\n", + " data_after_stop = data_cut.apply(lambda x: [i for i in x if i not in stopWords])\n", + " labels = data_new.loc[data_after_stop.index, 'label']\n", + " adata = data_after_stop.apply(lambda x: ' '.join(x))\n", + " return adata, data_after_stop, labels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3ae80f9", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_confusion_matrix(cm, classes, normalize=False, title='Confusion matrix', cmap=plt.cm.Blues):\n", + " sns.heatmap(cm, annot=True)\n", + " plt.ylabel('True label')\n", + " plt.xlabel('Predicted label')\n", + " plt.title(title)\n", + " plt.xticks(np.arange(len(classes)), classes)\n", + " plt.yticks(np.arange(len(classes)), classes)\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56dbb0d1", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "adata, data_after_stop, lables = data_process()\n", + "data_tr, data_te, labels_tr, labels_te = train_test_split(adata, lables, test_size=0.2)\n", + "countVectorizer = CountVectorizer()\n", + "data_tr = countVectorizer.fit_transform(data_tr)\n", + "X_tr = TfidfTransformer().fit_transform(data_tr.toarray()).toarray()\n", + "data_te = CountVectorizer(vocabulary=countVectorizer.vocabulary_).fit_transform(data_te)\n", + "X_te = TfidfTransformer().fit_transform(data_te.toarray()).toarray()\n", + "model = GaussianNB()\n", + "model.fit(X_tr, labels_tr)\n", + "pred = model.predict(X_te)\n", + "score = model.score(X_te, labels_te)\n", + "with open('model.pkl', 'wb') as f:\n", + " pickle.dump(model, f)\n", + "with open('countVectorizer.pkl', 'wb') as f:\n", + " pickle.dump(countVectorizer, f)\n", + "plot_confusion_matrix(confusion_matrix(labels_te, pred), [1, 0], title=\"模型分类准确率{:.2f}%\".format(score * 100))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc83543e", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "word_fre = {}\n", + "for i in data_after_stop[lables == 0]:\n", + " for j in i:\n", + " if j not in word_fre.keys():\n", + " word_fre[j] = 1\n", + " else:\n", + " word_fre[j] += 1\n", + "\n", + "wc = WordCloud( background_color='white', font_path=r'C:/Windows/Fonts/SimHei.ttf')\n", + "wc.fit_words(word_fre)\n", + "plt.imshow(wc)\n", + "plt.show()\n", + "word_fre = {}\n", + "for i in data_after_stop[lables == 0]:\n", + " for j in i:\n", + " if j not in word_fre.keys():\n", + " word_fre[j] = 1\n", + " else:\n", + " word_fre[j] += 1\n", + "\n", + "wc = WordCloud( background_color='white', font_path=r'C:/Windows/Fonts/SimHei.ttf')\n", + "wc.fit_words(word_fre)\n", + "plt.imshow(wc)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bde6f19c", + "metadata": {}, + "outputs": [], + "source": [ + "0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5f089b32", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}