diff --git a/notebooks/project_final.ipynb b/notebooks/project_final.ipynb new file mode 100644 index 0000000..5550eb9 --- /dev/null +++ b/notebooks/project_final.ipynb @@ -0,0 +1,9428 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy import spatial\n", + "import gensim.downloader as api\n", + "from sklearn.decomposition import PCA\n", + "import torch\n", + "import torch.nn as nn\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.cluster import KMeans\n", + "import seaborn as sns\n", + "from seaborn.colors import crayons\n", + "from sklearn.metrics.pairwise import paired_cosine_distances,cosine_distances\n", + "import scipy as sp\n", + "from sklearn.utils.extmath import stable_cumsum\n", + "from sentence_transformers import SentenceTransformer\n", + "import tqdm\n", + "import plotly.express as px\n", + "import torch\n", + "from torcheval.metrics.functional import multiclass_confusion_matrix\n", + "from torch.optim.lr_scheduler import StepLR" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Toolbox

" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def z(x):\n", + " n = x.shape[0]\n", + " mean = torch.sum(x,dim=0)/n # X.mean()\n", + " std = torch.std(x,dim=0)\n", + " z_scores = (x - mean)/std\n", + " return z_scores" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Data

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "384-length embeddings" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Okay, we're going to take an even training shuffle first of 1000 of each, and then test on the last 89 unseen, along with 89 unseen of implicit, and 89 not hate. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/165316287.py:6: PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n" + ] + } + ], + "source": [ + "data1 = pd.read_csv(\"/Users/temp/Documents/Spring 2024/NLP/mmontgomery1-master/project/implicit-hate-corpus/implicit_hate_v1_stg1_posts.tsv\",sep=\"\\t\")\n", + "vecs = []\n", + "sbert384 = SentenceTransformer(\"all-MiniLM-L6-v2\")\n", + "embeddings = sbert384.encode(data1['post'])\n", + "for i in range(384):\n", + " data1['v_'+str(i)] = [j[i] for j in embeddings]\n", + " vecs.append(\"v_\"+str(i))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3-length embeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f994d7c4e56945018a08788efee02c5f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Batches: 0%| | 0/672 [00:00Visualizing the raw 384" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"fig = px.scatter_3d(df, x='v_0', y='v_1', z='v_2',\\n color='class',size_max=.01,opacity=0.4)\\nfig.show()\"" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"fig = px.scatter_3d(df, x='v_0', y='v_1', z='v_2',\n", + " color='class',size_max=.01,opacity=0.4)\n", + "fig.show()\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Assembling Even Testing and Training Sets

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "nh = data1.loc[data1['class']=='not_hate'][:1000]\n", + "eh = data1.loc[data1['class']=='explicit_hate'][:1000]\n", + "ih = data1.loc[data1['class']=='implicit_hate'][:1000]\n", + "train_data1 = pd.concat([nh,eh,ih])\n", + "nh2 = data1.loc[data1['class']=='not_hate'][1001:1089]\n", + "eh2 = data1.loc[data1['class']=='explicit_hate'][1001:1089]\n", + "ih2 = data1.loc[data1['class']=='implicit_hate'][1001:1089]\n", + "test_data1 = pd.concat([nh2,eh2,ih2])" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "train_data1 = train_data1.sample(frac=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Classifying Model

" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [], + "source": [ + "class IDHate_simple(nn.Module):\n", + " def __init__(self):\n", + " super(IDHate_simple,self).__init__()\n", + " self.softmax = nn.Softmax(dim=0)#Need this for the probabilities at the end\n", + " self.sigmoid = nn.Sigmoid()#Need this to normalize at each layer\n", + " self.tanh = nn.Tanh()#Need this for weights; want to be able to weight a component but in a way that doesn't affect the classification\n", + " self.W = nn.Parameter(torch.zeros((384,3),dtype=torch.float64),requires_grad=True)#used to make X-based weights\n", + " self.S = torch.zeros((1,3),requires_grad=False,dtype=torch.float64)\n", + " self.labels = ['implicit_hate', 'not_hate', 'explicit_hate']\n", + " self.output = torch.zeros((1,3))\n", + " return\n", + " \n", + " def forward(self,x): \n", + " self.S= x @ self.W\n", + " self.output = self.softmax(self.S)\n", + " return self.output,self.S\n", + "\n", + " def _print(self):\n", + " print(\"W\",\"\\n\",self.W)\n", + " print(\"S\",\"\\n\",self.S)\n", + " print(\"p\",\"\\n\",self.output)\n", + " return\n", + " def _train(self,data,epochs,learning_rate):\n", + " criterion = nn.CrossEntropyLoss()\n", + " torch.random.manual_seed(42) \n", + " np.random.seed(42)\n", + " optimizer = torch.optim.Adam(self.parameters(),\n", + " lr=learning_rate)\n", + " sched = StepLR(optimizer,gamma=0.3,step_size=100)\n", + " loss_val = []\n", + " # main training loop\n", + " for epoch in range(epochs):\n", + " optimizer.zero_grad()\n", + " np.random.shuffle(data)\n", + " losses = []\n", + " for batch, (X, y) in enumerate(data[:300]):\n", + " #print(y)\n", + " result = self.forward(X)\n", + " loss = criterion(result[0],y)\n", + " loss.backward() # computes all the gradients\n", + " optimizer.step()\n", + " losses.append(loss.item())\n", + " loss_val.append(np.mean(losses))\n", + " sched.step()\n", + " plt.figure()\n", + " plt.plot(loss_val, '-')\n", + " plt.ylabel('loss')\n", + " plt.xlabel('epoch')\n", + " plt.show()\n", + " return loss_val\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Training" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": {}, + "outputs": [], + "source": [ + "train_X1 = torch.tensor(train_data1[vecs].to_numpy(),dtype=torch.float64)\n", + "train_X1 = z(train_X1)\n", + "train_Y1 = []\n", + "for c in train_data1['class']:\n", + " y_hot = [0,0,0]\n", + " y_hot[int(['implicit_hate', 'not_hate', 'explicit_hate'].index(c))] = 1\n", + " y_hot = torch.tensor(y_hot,dtype=torch.float64)\n", + " train_Y1.append(y_hot)\n", + "m1train_data1 = list(zip(train_X1,train_Y1))\n", + "\n", + "test_X1 = torch.tensor(test_data1[vecs].to_numpy(),dtype=torch.float64)\n", + "test_X1 = z(test_X1)\n", + "test_Y1 = []\n", + "for c in test_data1['class']:\n", + " y_hot = [0,0,0]\n", + " y_hot[int(['implicit_hate', 'not_hate', 'explicit_hate'].index(c))] = 1\n", + " y_hot = torch.tensor(y_hot,dtype=torch.float64)\n", + " test_Y1.append(y_hot)\n", + "m1test_data1 = list(zip(test_X1,test_Y1))" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAG1CAYAAAARLUsBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACC70lEQVR4nO3dd3wU1fo/8M+WVCAJNaH3Lh3BABY0iqAo6r0qoiC2q1dsWLGXq/D1/rBdUexYrgUV8SqKAgpI7wrSe5GETkgCKbvz+yPs5szs1N3ZnU3yeb9eviS7s7Ozs7MzzzznOee4JEmSQERERFSNuJ3eACIiIqJYYwBERERE1Q4DICIiIqp2GAARERFRtcMAiIiIiKodBkBERERU7TAAIiIiomqHARARERFVOwyAiIiIqNphAERERETVjqMB0Pz58zF06FA0atQILpcL06dP111+//79uO6669CuXTu43W7ce++9qst9+eWX6NChA5KTk9GlSxf88MMP9m88ERERVVqOBkCFhYXo1q0bJk2aZGr54uJi1K9fH48//ji6deumusyiRYswfPhw3HzzzVi9ejWGDRuGYcOGYd26dXZuOhEREVVirniZDNXlcuGbb77BsGHDTC1/3nnnoXv37njllVdkj19zzTUoLCzE999/H3zsrLPOQvfu3TF58mRT6/b7/fjrr79Qq1YtuFwusx+BiIiIHCRJEk6cOIFGjRrB7dbP8XhjtE0xs3jxYowdO1b22KBBg3Sb14qLi1FcXBz8e9++fejUqVO0NpGIiIiiaM+ePWjSpInuMlUuAMrNzUVmZqbssczMTOTm5mq+Zvz48XjmmWdCHt+zZw/S0tJs30YiIiKyX35+Ppo2bYpatWoZLlvlAqBwjBs3TpY1CuzAtLQ0BkBERESVjJnylSoXAGVlZSEvL0/2WF5eHrKysjRfk5SUhKSkpGhvGhEREcWJKjcOUHZ2NubMmSN7bNasWcjOznZoi4iIiCjeOJoBKigowNatW4N/79ixA2vWrEGdOnXQrFkzjBs3Dvv27cNHH30UXGbNmjXB1x48eBBr1qxBYmJisGj5nnvuwbnnnouJEyfikksuweeff44VK1bg7bffjulnIyIiovjlaDf4uXPnYuDAgSGPjxo1ClOmTMGNN96InTt3Yu7cucHn1Nr1mjdvjp07dwb//vLLL/H4449j586daNu2LV588UUMGTLE9Hbl5+cjPT0dx48fZw0QERFRJWHl+h034wDFEwZARERElY+V63eVqwEiIiIiMsIAiIiIiKodBkBERERU7TAAIiIiomqHARARERFVOwyAiIiIqNphAERERETVTpWbCyyenSzx4UhRCRLcLjRIS3Z6c4iIiKotZoBi6Of1ueg/4ReMnfq705tCRERUrTEAiiGPu3wajzK/3+EtISIiqt4YAMWQ93QA5PNz9hEiIiInMQCKIY+7fHeXMQAiIiJyFAOgGGIGiIiIKD4wAIqhYA2QjwEQERGRkxgAxRAzQERERPGBAVAMsRcYERFRfGAAFENeDzNARERE8YABUAyxFxgREVF8YAAUQ6wBIiIiig8MgGKoogaIARAREZGTGADFEDNARERE8YEBUAxVjAPEXmBEREROYgAUQ97TRdDMABERETmLAVAMeTysASIiIooHDIBiiDVARERE8YEBUAyJvcAkiUEQERGRUxgAxVAgAwQATAIRERE5hwFQDHmEAIjzgRERETmHAVAMBXqBAawDIiIichIDoBiSZ4AYABERETmFAVAMiTVAZT4GQERERE5hABRDbrcLrtMxEGuAiIiInMMAKMY4FhAREZHzGADFWMV8YAyAiIiInMIAKMY4HxgREZHzGADFmDgaNBERETmDAVCMsQaIiIjIeQyAYiyQASr1sRcYERGRUxgAxViit3yXMwAiIiJyDgOgGAsEQCVlDICIiIicwgAoxpK8HgBAMQMgIiIixzAAijFmgIiIiJzHACjGkk4HQMwAEREROYcBUIwFAqASn8/hLSEiIqq+GADFWDADVMoMEBERkVMYAMVYsAaI3eCJiIgcwwAoxoK9wJgBIiIicgwDoBhL9DADRERE5DQGQDGWlBCoAWIRNBERkVMYAMVYsAiaGSAiIiLHMACKsUT2AiMiInKcowHQ/PnzMXToUDRq1AgulwvTp083fM3cuXPRs2dPJCUloU2bNpgyZYrs+aeffhoul0v2X4cOHaLzAcIQKIJmDRAREZFzHA2ACgsL0a1bN0yaNMnU8jt27MAll1yCgQMHYs2aNbj33ntxyy234KeffpIt17lzZ+zfvz/434IFC6Kx+WFhBoiIiMh5XifffPDgwRg8eLDp5SdPnoyWLVti4sSJAICOHTtiwYIFePnllzFo0KDgcl6vF1lZWbZvrx0S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RlUPIyCiKisegx+qnBgAUZXDGqDYkBhpElElxgCIqhxelmODcSYRVWYMgKjKqayTnRIRUewwAKIqh+FPbHA/E1FlxgCIqhwmgGKjpCy+hv4nIrKCARARhSXBUz7WCCcbJaLKiAEQEYXlrRt64fwODfD5bdlObwoRkWUcCJGIwnJ+h0yc38HZUW+JiMLFDBARERFVOwyAiIiIqNphAERERETVDgMgIiIiqnYYABEREVG1wwCIiIiIqh0GQERERFTtMAAiIiKiaocBEFU5n992FprVScVHN/VxelOIiChOuSSJU0cq5efnIz09HcePH0daWprTm0NEREQmWLl+MwNERERE1Q4DICIiIqp2GAARERFRtcMAiIiIiKodBkBERERU7TAAIiIiomqHARARERFVOwyAiIiIqNphAERERETVDgMgIiIiqnYYABEREVG1wwCIiIiIqh0GQERERFTtMAAiIiKiasfr9AbEI0mSAAD5+fkObwkRERGZFbhuB67jehgAqThx4gQAoGnTpg5vCREREVl14sQJpKen6y7jksyESdWM3+/HX3/9hVq1asHlctm67vz8fDRt2hR79uxBWlqareumCtzPscH9HDvc17HB/Rwb0drPkiThxIkTaNSoEdxu/SofZoBUuN1uNGnSJKrvkZaWxh9XDHA/xwb3c+xwX8cG93NsRGM/G2V+AlgETURERNUOAyAiIiKqdhgAxVhSUhKeeuopJCUlOb0pVRr3c2xwP8cO93VscD/HRjzsZxZBExERUbXDDBARERFVOwyAiIiIqNphAERERETVDgOgGJo0aRJatGiB5ORk9O3bF8uWLXN6kyqV8ePH48wzz0StWrXQoEEDDBs2DJs2bZItc+rUKdx5552oW7cuatasiauuugp5eXmyZXbv3o1LLrkEqampaNCgAR588EGUlZXF8qNUKhMmTIDL5cK9994bfIz72R779u3D9ddfj7p16yIlJQVdunTBihUrgs9LkoQnn3wSDRs2REpKCnJycrBlyxbZOo4cOYIRI0YgLS0NGRkZuPnmm1FQUBDrjxLXfD4fnnjiCbRs2RIpKSlo3bo1nnvuOdl0CdzX1s2fPx9Dhw5Fo0aN4HK5MH36dNnzdu3TP/74A2effTaSk5PRtGlTvPjii/Z8AIli4vPPP5cSExOl999/X/rzzz+lW2+9VcrIyJDy8vKc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paWlMf40lYsyAOJ+tsd3330nnXHGGVJSUpLUoUMH6e2335Y97/f7pSeeeELKzMyUkpKSpAsuuEDatGmTbJnDhw9Lw4cPl2rWrCmlpaVJo0ePlk6cOBHLjxH38vPzpXvuuUdq1qyZlJycLLVq1Up67LHHZF2rua+t+/XXX1XPyaNGjZIkyb59+vvvv0sDBgyQkpKSpMaNG0sTJkywZfs5GzwRERFVO6wBIiIiomqHARARERFVOwyAiIiIqNphAERERETVDgMgIiIiqnYYABEREVG1wwCIiIiIqh0GQERERFTtMAAiIjJh7ty5cLlcIZPAElHlxACIiIiIqh0GQERERFTtMAAiokrB7/dj/PjxaNmyJVJSUtCtWzd89dVXACqap2bMmIGuXbsiOTkZZ511FtatWydbx9dff43OnTsjKSkJLVq0wMSJE2XPFxcX4+GHH0bTpk2RlJSENm3a4L333pMts3LlSvTu3Rupqano168fNm3aFN0PTkRRwQCIiCqF8ePH46OPPsLkyZPx559/4r777sP111+PefPmBZd58MEHMXHiRCxfvhz169fH0KFDUVpaCqA8cLn66qtx7bXXYu3atXj66afxxBNPYMqUKcHXjxw5Ep999hlee+01bNiwAW+99RZq1qwp247HHnsMEydOxIoVK+D1enHTTTfF5PMTkb04GzwRxb3i4mLUqVMHs2fPRnZ2dvDxW265BUVFRbjtttswcOBAfP7557jmmmsAAEeOHEGTJk0wZcoUXH311RgxYgQOHjyIn3/+Ofj6hx56CDNmzMCff/6JzZs3o3379pg1axZycnJCtmHu3LkYOHAgZs+ejQsuuAAA8MMPP+CSSy7ByZMnkZycHOW9QER2YgaIiOLe1q1bUVRUhAsvvBA1a9YM/vfRRx9h27ZtweXE4KhOnTpo3749NmzYAADYsGED+vfvL1tv//79sWXLFvh8PqxZswYejwfnnnuu7rZ07do1+O+GDRsCAA4cOBDxZySi2PI6vQFEREYKCgoAADNmzEDjxo1lzyUlJcmCoHClpKSYWi4hISH4b5fLBaC8PomIKhdmgIgo7nXq1AlJSUnYvXs32rRpI/uvadOmweWWLFkS/PfRo0exefNmdOzYEQDQsWNHLFy4ULbehQsXol27dvB4POjSpQv8fr+spoiIqi5mgIgo7tWqVQsPPPAA7rvvPvj9fgwYMADHjx/HwoULkZaWhubNmwMAnn32WdStWxeZmZl47LHHUK9ePQwbNgwAcP/99+PMM8/Ec889h2uuuQaLFy/G66+/jjfeeAMA0KJFC4waNQo33XQTXnvtNXTr1g27du3CgQMHcPXVVzv10YkoShgAEVGl8Nxzz6F+/foYP348tm/fjoyMDPTs2ROPPvposAlqwoQJuOeee7BlyxZ0794d3333HRITEwEAPXv2xNSpU/Hkk0/iueeeQ8OGDfHss8/ixhtvDL7Hm2++iUcffRT//Oc/cfjwYTRr1gyPPvqoEx+XiKKMvcCIqNIL9NA6evQoMjIynN4cIqoEWANERERE1Q4DICIiIqp22ARGRERE1Q4zQERERFTtMAAiIiKiaocBEBEREVU7DICIiIio2mEARERERNUOAyAiIiKqdhgAERERUbXDAIiIiIiqHQZAREREVO38fza35uJ0ci6IAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model = IDHate_simple()\n", + "loss = model._train(m1train_data1,1000, 0.00001)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trained 170\n", + "untrained 88\n" + ] + } + ], + "source": [ + "correct = 0\n", + "s1csmart = []\n", + "s2csmart = []\n", + "s3csmart = []\n", + "actual = []\n", + "pred = []\n", + "for x,y in m1test_data1:\n", + " results = model(x)\n", + " if int(torch.argmax(results[0])) == list(y).index(1):\n", + " correct+=1\n", + " s1csmart.append(results[1][0].item())\n", + " s2csmart.append(results[1][1].item())\n", + " s3csmart.append(results[1][2].item())\n", + " actual.append(list(y).index(1))\n", + " pred.append(torch.argmax(results[0]))\n", + "print(\"trained\",correct)\n", + "stupid_model=IDHate_simple()\n", + "correct = 0\n", + "#test_data1 = train_data1[:500]\n", + "for x,y in m1test_data1:\n", + " results = stupid_model(x)\n", + " if int(torch.argmax(results[0])) == list(y).index(1):\n", + " correct+=1\n", + "print(\"untrained\",correct)" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "v_1=%{x}
v_2=%{y}
v_3=%{z}
actual=%{marker.color}", + "legendgroup": "", + "marker": { + "color": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "coloraxis": "coloraxis", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "", + "scene": "scene", + "showlegend": false, + "type": "scatter3d", + "x": [ + 0.8387866851267805, + -2.073770216650662, + 1.1495770362819793, + 0.5264714337120309, + -0.9846454230969818, + 3.2678199548253515, + 2.622043202210782, + -0.21135850827479608, + -0.5954092186888436, + -0.2915186891331253, + -1.5211559228796636, + 0.3449189164444596, + -1.0294577762152013, + -1.5875080647511741, + 0.26543310554092076, + -1.9248383914635632, + 0.8823572163329025, + 0.43591978240616397, + -2.5156440913016835, + -0.2462152138952386, + 2.8497176853093613, + 1.437692730641079, + -0.9269784811253192, + 0.6004313862748736, + 0.8603621436259301, + 1.4138568052581362, + 0.6635966710591243, + -0.23275685510898297, + 0.8832919867254234, + 0.2398932132845081, + 0.5416398451516597, + 3.7189261767738993, + -1.6809677010597164, + -0.789256431071211, + 3.093853530296046, + -1.5445198794123707, + 0.09665863829471144, + -1.6830225909375391, + 1.0382178355199936, + 0.18214837126402372, + -1.548528671407601, + 2.4489857033894125, + 1.968557994025182, + -0.38942383506593986, + 3.2708961115807726, + -1.0381006895558433, + -1.6073295393295595, + 1.0077875879459084, + -0.11566693218691321, + -1.9230910859314418, + -1.1513704162241147, + 2.0253685352426682, + -0.5812403582187204, + 0.00012550854437839987, + -0.9663999050551002, + -0.13082635683223032, + 1.6737541255756039, + -0.9384641586981486, + 1.082024389312833, + -0.07005266222472159, + 2.8204160539823246, + 1.6088307308033767, + -1.0388166210095324, + 4.272569597965614, + -0.17833287835544887, + -3.2531749999503536, + 2.9893883833974, + 0.0575876724993408, + 0.5975454030811427, + 0.9287578332009753, + 0.8866376608991103, + -1.1825886712618354, + 0.1056557165339066, + 0.724086380552721, + -0.4577888213065626, + -2.4112747043591107, + 3.2470084423082897, + 0.2693319093486726, + -1.7128004611875733, + -2.8547106879369237, + 0.8883436098592623, + 0.5103489003130942, + 0.4499678201814138, + 3.865136103471127, + -0.7590115806609363, + -1.1529638928168908, + -0.8619893772466012, + -0.6052870505138641, + -3.9905366801592947, + -1.3568919213981756, + -3.2575887288261924, + 2.137376662193581, + -1.8383460340883597, + -1.7450427233287784, + 0.1980874475139457, + -0.6427728329779454, + -2.4262502828144346, + -0.2338887034392572, + -1.8791330944233806, + -0.797036715968878, + -0.46240746040957986, + -2.428159567511115, + -4.620041813082986, + -1.6224634821067152, + 1.252961640663135, + -1.3195033567812027, + -2.0439784578621385, + -1.5829906571523455, + -3.2639923548886545, + -0.4689480411078439, + -2.406523411678063, + -1.1427656385171847, + -0.1749565796752678, + -3.341746660682283, + 0.15151438810052842, + -0.8764685464653854, + -1.430013643518539, + -1.3003979129014245, + 0.3156859977065152, + 1.4059606848186252, + 0.4302723232221357, + -0.2720387848560284, + -0.2950483624626726, + -3.119648612180656, + -2.385470886493662, + -2.3499811102411563, + -0.9679685281562171, + 0.11824752551997074, + -1.8534336337993247, + -4.176203191848279, + -1.1574146742766722, + -0.5151240807076364, + -0.3351640625892756, + -1.2215980565338818, + -1.2215980565338818, + 0.5640387769781812, + -1.6873375037958087, + -3.270400594033119, + -2.9879947706355923, + -2.853523726002201, + 0.9954480784844982, + -2.868370058561088, + -1.5700145720858885, + -0.06436386513195436, + -2.4116809446075007, + -0.10381516565835636, + -2.124050190385591, + -3.563628086498005, + -2.4604338570078577, + -2.261247298125391, + -3.060067745257771, + 0.9294851752781876, + -2.7334312902814375, + -0.7615933426497505, + -0.24611648815608145, + -0.2550565004010094, + -2.456750091344801, + -0.6747277518924429, + -1.241310741457527, + -1.601578076566641, + 0.7049198943237982, + -2.1511814193806713, + -1.5273743701422906, + -0.8288228923316499, + -0.16403701100885382, + -2.568479729075547, + -2.457201984970327, + -3.0449492045382116, + -1.579788519361495, + -4.190973263993629, + 1.2726383847806975, + 0.7264056762278661, + -1.3027884835139432, + 0.42912919069714184, + 0.11585478511662095, + -1.155867717773031, + -0.2977168288213893, + 1.0017272860773034, + -0.11972477231640058, + 1.801839567870574, + 1.8118651603685587, + 3.4492277514828014, + 0.6322754070372891, + 3.1441660926133412, + 3.3307713674027073, + 1.8552391225715144, + 4.102863183070761, + -1.0454062661098273, + 3.4010617889903934, + -2.2510877493730304, + 1.4363980869009185, + 3.093000541770227, + -2.5052243872056095, + -0.6296910761347227, + 2.4284573756666306, + 0.957766038553209, + -0.7805255503861666, + 2.333996683181253, + -1.9944764627408287, + -0.22151778273422462, + 2.427830848381542, + 1.8573903282188864, + -1.965344723212603, + -0.049678548542468004, + 0.5221981819835979, + 1.314451516128746, + -0.49807669865634113, + 0.3423438883831747, + 2.810172530551706, + 0.7171984438618284, + 0.6682071758156783, + 1.2862074341904197, + 3.640008175028831, + -1.290140574204779, + 0.8458937265301594, + 3.1584478941763785, + 2.562711538671963, + 1.8348202720942106, + 1.3275357598510575, + 3.5463603977155183, + 1.221395132814071, + -4.09982802240397, + 0.9899352499877356, + 6.035093274897092, + 2.4325100088765526, + 2.612141511247202, + 2.8095946940343977, + -0.656837449968424, + -1.3508036042130804, + 1.3630707319774358, + -2.1050412252070685, + 1.7287415813809526, + -0.1673972181753749, + -1.6918349627668214, + -0.33900753885413515, + 0.4880315398343176, + 0.18341543878413233, + 0.9934737546813154, + 0.7333678673805599, + 2.692311793714741, + 0.9672490889906228, + 2.598123155297623, + 2.386159655970244, + 2.2886557200619375, + 1.064791105998927, + 2.8547134935287306, + 1.4279995128953569, + -0.05185247521099401, + -1.3470081116507755, + 2.564684520031833, + 1.152113404140138, + 1.7855672856734874, + 2.2209702512898453, + 1.9869558809991241, + 0.1333939935446249, + 2.021960088229767, + -0.46066908075534874, + -0.8091356440559417, + 2.2003298553300845, + 0.5455915187674549, + 3.7223763559122025, + 2.0231584051023317, + 2.528680025336405, + 0.44903654532005544 + ], + "y": [ + 0.25317876640011183, + 4.468453939678616, + -0.5242445442212513, + 3.5696762987005535, + 0.9235183628829922, + -2.8610506336250587, + 2.4287869349956215, + 2.3219127517335347, + 5.98226693425495, + 0.9753684862384969, + 0.29289248546270397, + -0.5327855572845211, + 3.8994541087991483, + -2.9124310025691043, + 3.9817021610539114, + 4.412685179080311, + 1.0136930561441835, + 0.22169219400484125, + 2.5547880504522995, + 1.479526849671312, + -0.26166799774248284, + -0.3808279015218118, + 1.6932044593119517, + 2.6683255970694524, + 3.804258417352826, + -0.8199818986901497, + -1.0001168476006965, + 3.772840672074094, + 3.343470801338606, + 1.3357443177632837, + 1.8328236314465498, + 2.722845044634006, + 1.8462469524304537, + 4.9510879228193385, + 4.46604938403608, + 5.916731617856671, + 0.27560335260571134, + 2.0035083622018566, + 2.599277960801823, + -0.5299678737887676, + 1.3589000976197037, + -0.16870876669508034, + -0.20938796367429469, + -2.1437273369516934, + -1.4279220288309238, + -0.8857940016538659, + 5.811419593964334, + 1.8282637451868864, + 0.9351885182089427, + 1.2284939879394894, + 2.9293994377324797, + 2.086427418560406, + 0.033941753955260445, + 3.1126820942946267, + -0.8596323762181308, + 2.9793951609317424, + 1.5300111190032668, + 3.3719998211616034, + -2.561132265717389, + 0.970447549649202, + -0.5628787499617518, + 1.534939850299763, + -1.4627823561601365, + -0.05805937873101108, + 4.631090229716735, + 1.4210984600265903, + -1.8313099659097398, + 3.040176679098461, + 3.7820960409272626, + 2.230599777930397, + 2.9054059900892866, + 3.5621174172695715, + -0.1809809510718005, + 2.262215304694968, + 1.0087636830755362, + 1.1357812918932142, + -1.165394058183388, + 2.1283849406902773, + 2.129586647271564, + 2.4306443658214487, + -0.8478868159624529, + 1.7437225461474628, + 2.900088344860361, + -0.5838275505543206, + -1.5692752742141423, + 3.068184218814796, + 2.3829137358386716, + 0.596346588679149, + 2.0544052985942605, + -4.1294434797324895, + -0.8880205514468759, + -1.3145513243752058, + -4.089486304863521, + -3.573009975470451, + -3.538951079771528, + -2.0208419320924578, + -0.7395173100619228, + -2.493418131515014, + -2.754124410860579, + -3.4169198046362625, + -4.01287508150867, + -2.4720197001546484, + 1.9150906243439472, + 0.4883123168451275, + -7.351607200053969, + -0.05292602587574641, + 1.190007144012152, + -4.167758981829586, + -2.8096734094307316, + -2.6729606309112555, + -4.5311611520097905, + 2.021878122968971, + -2.012575671261586, + 3.286516857244883, + -2.6449500111245396, + -0.17838107796421132, + -1.8035388611224592, + 1.607950171022519, + -3.383161061373515, + -1.2375781972539048, + -3.261774611705296, + -0.9166216564726499, + -1.2210968223598768, + 2.265158399671315, + 0.37173251616498926, + 0.6291987752734901, + 2.0213359042007424, + -1.6700741836202355, + -3.3786980023897475, + -0.14202931884721087, + 0.29816037309004295, + -0.02036680376716285, + -0.009696916191742011, + 0.5559979345611269, + 0.5559979345611269, + -3.0144526019502695, + 1.9796659851605085, + 0.1813292417196228, + -1.8398929471317829, + -3.109206279346713, + -2.3043617120879287, + -4.182652463558984, + -0.4030013256852793, + -1.2660178071683557, + -0.8740447619875777, + -4.684843072414653, + 1.6321931835443262, + -3.759575723919129, + 3.4946591397515805, + -2.265276840453204, + 0.00976279834322924, + -1.7756074168299047, + 2.583494330290481, + -0.4012996719078893, + 2.381576631074279, + 0.3703260311389699, + -2.3160126340895832, + 2.8615088283897068, + -0.43230870205002175, + 1.748126261630012, + -2.6845201228319886, + 0.6768040243084501, + -3.703878111776331, + 0.6470430647231782, + -5.701482571600552, + -3.507095695259158, + -1.8752545690931819, + 1.825525722086798, + 0.02716538502158128, + 1.576484708598168, + -2.628964661770367, + -1.2327177707715744, + 2.088380964200502, + -1.520999798182165, + -2.4814922742488177, + -2.3357606357161274, + -1.2445427539952059, + -0.2856508195979291, + 0.6013713653539516, + -4.001831591381824, + -1.4280221724348878, + -0.3306668483612111, + -0.6977610775586414, + -0.058612081007334865, + -1.7736338114450172, + 2.9598834712563504, + -1.2168031447536078, + 2.6989350277443127, + -1.9421821207272436, + 1.11553999234444, + -0.36473905970032283, + -0.6999868934919057, + 2.7518516721340873, + -2.641129677317638, + -0.9967735642089015, + 0.5928614362952409, + -1.7231500486893108, + -1.0896311051714165, + 2.528289796145304, + 1.2582493707715088, + 0.49286516950357706, + -1.402375526677292, + 2.1889053311308206, + -2.155172578772136, + -1.3549406799105377, + -1.4072791080734786, + 2.0729878293659296, + 0.812185797319579, + -1.0428157040420138, + 0.5559256726908737, + -0.5111790283061043, + 0.644853231324853, + -3.13746928786732, + 1.5875423531580746, + -1.6628831192491802, + -1.695564896935604, + -0.9487017394721596, + 0.2584984101722657, + -2.239367495161619, + -0.4309696346661856, + -1.9959492392704905, + 2.156784483433285, + -0.7169084342226895, + -0.7205509586429206, + -1.5225085519169856, + -5.528279420865469, + 2.2446531659428697, + -0.649681062008641, + 1.4355224780557636, + -0.2669102151641976, + 3.779456618637946, + -0.9510792484318016, + -3.6978219335719773, + 3.316224915660375, + -1.161947960934887, + -1.6474817052635033, + 2.74384092410393, + -1.4755908647288714, + -0.19126860214382913, + -0.9135693715448763, + -1.22458423711552, + 1.8724747761492444, + 0.2637291554191392, + -2.7711401453386477, + -2.059119365755785, + -4.429372338460192, + -1.1162991446512969, + 2.1032887480590077, + 1.3917382971938468, + -0.9702723180035545, + -2.0359005927699227, + -0.42327975435911064, + -2.212047399925403, + 0.3692240736735071, + -1.7610071926987714, + -1.44513660981283, + 1.15787181533258, + 0.8013526757199699, + 1.0007926396653395, + 1.5743899749213244, + -1.4646324218036366, + 0.8114882427143124, + 0.44213679189573685, + -1.6253672306729843 + ], + "z": [ + -0.9059122264980993, + -2.3406825794567707, + -0.6569698738589147, + -4.174167491596196, + -0.1461458976126525, + -0.9102540214727444, + -4.9549765829378725, + -2.169475902455811, + -5.367221919803617, + -0.6767720199187454, + 1.0245162943301183, + 0.21333087076680246, + -3.316662970418874, + 4.21824722201471, + -4.501253866541381, + -2.3193284400107546, + -1.712448781505761, + -0.47733849444281784, + -0.3919893311648842, + -0.9711164708748268, + -2.4505803312167007, + -0.8147917199868331, + -0.7367127992204598, + -2.7565841590506275, + -4.827376444401658, + -0.45280005730324624, + 0.7288341361092168, + -3.4268781530725065, + -4.353592086974469, + -1.362522787741749, + -1.998391166042772, + -6.413447983466178, + 0.3754037276596869, + -3.9269577359766528, + -7.494844809115003, + -4.007132027083633, + -0.34202859291306276, + -0.03606081512112179, + -3.65447768668931, + 0.5870705426378318, + 0.004242261950673676, + -2.190022874106784, + -1.2465091578166674, + 2.590998735866153, + -1.8594791746587278, + 1.6298484904501964, + -4.033911166233295, + -2.560519905160385, + -1.1555285770426151, + 0.7132711101956541, + -1.9476201328936422, + -4.163305302429333, + 1.0937083310435116, + -3.4613328878922873, + 1.5879413669019262, + -3.0763809605971306, + -3.0529319723767516, + -2.5729152649175417, + 1.3982688553300038, + -0.7115229387742465, + -2.100135457309415, + -3.3138125975856125, + 2.2947427873133184, + -4.093371547117163, + -4.047422475184895, + 1.3517268743581057, + -1.284515411242161, + -3.1617041315388468, + -4.278828324175008, + -3.5925710147453507, + -3.7847361399991084, + -3.0174230084247977, + -0.1542321096984156, + -2.942042942887981, + -0.4423611902542379, + 1.2193582246909356, + -1.4456633823105274, + -2.66838341819906, + -0.8317264859291144, + -0.2524325450952126, + -0.09186279870354513, + -2.379530902061986, + -3.63972801446796, + -3.4348076101014513, + 2.366646925038721, + -2.003894408686383, + -1.3725583396171261, + -0.3121948450018215, + 1.9768877251488621, + 5.0814840773007806, + 4.235074701743898, + -0.7842031075573519, + 5.614390356856802, + 5.02824946208367, + 2.97037722255011, + 2.4351026263712825, + 2.8796436743913283, + 2.606828272953548, + 4.728928891321511, + 4.370599293281635, + 4.427612871382872, + 4.500766093077536, + 2.6047169807244517, + 1.3890855229603554, + 6.387376898591724, + 1.6195254336763598, + 0.7536041319389262, + 5.454431289859918, + 6.105622674164678, + 3.3369918217920005, + 6.810248974214037, + -1.2197957303255151, + 1.9289919650712646, + -0.21581838190305525, + 2.6776424886727996, + 1.4583966112270206, + 3.2321186854601285, + -0.4830816002370028, + 3.4786441480545447, + -0.12238291001700263, + 2.8819296233810623, + 1.384547437019838, + 1.6633439160607364, + 1.018366797508797, + 2.257175242256925, + 1.5027849163334754, + -1.1955704479940992, + 1.6859027547044876, + 5.629253300050983, + 4.311790068650951, + 0.9778160354210851, + 0.4607458253261797, + 0.44124003797163025, + 0.3989268864132116, + 0.3989268864132116, + 2.355818721931445, + -0.4540613450040135, + 2.808136504917081, + 4.606447651028462, + 5.8873113610844, + 1.3994731450161029, + 6.7944787209969615, + 1.8211673031615185, + 1.2301876398198002, + 3.2312121802859544, + 4.48520742336599, + 0.3558622401109771, + 6.953475443675995, + -1.304827443540789, + 4.681430459615779, + 2.794769294684904, + 0.7945407955147088, + 0.7435577284437057, + 0.8795421181487216, + -1.884341132318641, + -0.4890106886175322, + 4.874327166066532, + -2.1795928318303464, + 1.4866193428076309, + -0.8028087844777351, + 1.8449133302978495, + 1.2887486897736748, + 5.631851313651488, + 0.22773275512592916, + 5.894648887068138, + 5.689269318944344, + 4.363473190376647, + 1.0883211014511982, + 1.3315733000390764, + 2.5791319745047026, + 1.5362222973760349, + 0.4754656559510229, + -0.9833437637494048, + 1.4560095421533754, + 2.539394652238414, + 3.240472826643826, + 1.6290787531383784, + -0.10545702156813308, + -0.3350309309283694, + 2.7282385912570692, + -0.5216510020766107, + -3.049791628080241, + 0.08913675524035636, + -2.9029616080596226, + -1.5276872433781983, + -4.858737548453558, + -2.8264380413949777, + -1.318461351028378, + -1.321387206627297, + 0.8957846229362783, + -1.4370516958185853, + -2.503750017206147, + -0.27142336207005446, + 3.5294266574456854, + -1.2962187332737214, + -1.7784063205880223, + 2.377376922154545, + -1.089975266013435, + -0.4341801615672167, + -1.0654206357868141, + -2.711653888873167, + -0.8205377656933917, + -0.1408670296357743, + 1.7332781918975417, + 0.7535312955843747, + 0.20202315623293887, + -1.442528418376403, + -1.2190552820360288, + -1.7692992746024432, + -0.6140173305076657, + -0.06624224449064053, + -1.7106508433318277, + -0.18650320575778384, + -0.380134658301611, + 0.9897745196469091, + -1.0496199493551877, + -1.6026813077788904, + -1.830098385190852, + 0.3893026042994987, + -3.0206120277870845, + 0.7411826916452819, + 1.9111057437928234, + -0.008549137891323139, + -5.144577655090625, + -0.9404024896136701, + 3.1297303444373012, + -5.225198430596035, + 1.015434599859852, + -0.3763209576806328, + -0.8141717210120072, + -1.5514207027506786, + -0.3271087058314869, + 3.9969252647893967, + -1.6636920614276236, + 1.3392315113013353, + 1.0362769082362244, + -2.891496279054469, + 0.4321048941111507, + -0.7994489338419075, + -1.8540611140995402, + 0.629946549888573, + -4.522884496633183, + -2.3926263748692556, + 0.5055194522558539, + 1.0180040146187634, + 1.7637767643726239, + -0.012629925909178608, + -2.068063596576615, + -0.25716501438691297, + -1.9257159290956491, + 1.175366846693328, + -1.2472583724581714, + -0.06414587307346914, + -2.2927668238052865, + 1.81857450601471, + -0.5966044820354182, + -0.4995986652486968, + -0.5381917125984262, + -3.232355415380602, + -1.5849247198568779, + -1.6839147068209872, + -3.0550967455400584, + -2.6268765582553177, + 1.5452771786626434 + ] + } + ], + "layout": { + "coloraxis": { + "colorbar": { + "title": { + "text": "actual" + } + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "legend": { + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "scene": { + "domain": { + "x": [ + 0, + 1 + ], + "y": [ + 0, + 1 + ] + }, + "xaxis": { + "title": { + "text": "v_1" + } + }, + "yaxis": { + "title": { + "text": "v_2" + } + }, + "zaxis": { + "title": { + "text": "v_3" + } + } + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cdfsmart = pd.DataFrame()\n", + "cdfsmart['v_1'] = s1csmart\n", + "cdfsmart['v_2'] = s2csmart\n", + "cdfsmart['v_3'] = s3csmart\n", + "cdfsmart['actual'] = actual\n", + "fig = px.scatter_3d(cdfsmart, x='v_1', y='v_2', z='v_3',\n", + " color='actual',size_max=.01,opacity=0.4)\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[52, 21, 15],\n", + " [22, 54, 12],\n", + " [ 4, 20, 64]])" + ] + }, + "execution_count": 205, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "multiclass_confusion_matrix(torch.tensor(pred,dtype=torch.int64),torch.tensor(actual,dtype=torch.int64),3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Regression-ish Style

" + ] + }, + { + "cell_type": "code", + "execution_count": 228, + "metadata": {}, + "outputs": [], + "source": [ + "lindict = dict(zip(['not_hate','implicit_hate', 'explicit_hate'],[0,1,2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 229, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/3850033164.py:2: UserWarning:\n", + "\n", + "To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", + "\n", + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/3850033164.py:8: UserWarning:\n", + "\n", + "To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n", + "\n" + ] + } + ], + "source": [ + "train_X1 = torch.tensor(train_data1[vecs].to_numpy(),dtype=torch.float64)\n", + "train_X1 = torch.tensor(z(train_X1),dtype=torch.float64)\n", + "train_data1['lin_label'] = [lindict[e] for e in train_data1['class']]\n", + "train_Y1 = torch.tensor(train_data1['lin_label'].to_numpy(),dtype=torch.float64)\n", + "m2train_data1 = list(zip(train_X1,train_Y1))\n", + "\n", + "test_X1 = torch.tensor(test_data1[vecs].to_numpy(),dtype=torch.float64)\n", + "test_X1 = torch.tensor(z(test_X1),dtype=torch.float64)\n", + "test_data1['lin_label'] = [lindict[e] for e in test_data1['class']]\n", + "test_Y1 = torch.tensor(test_data1['lin_label'].to_numpy(),dtype=torch.float64)\n", + "m2test_data1 = list(zip(test_X1,test_Y1))" + ] + }, + { + "cell_type": "code", + "execution_count": 230, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "264" + ] + }, + "execution_count": 230, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(m2test_data1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Regression 1pc" + ] + }, + { + "cell_type": "code", + "execution_count": 231, + "metadata": {}, + "outputs": [], + "source": [ + "class RegressHate_1_notworking(nn.Module):\n", + " def __init__(self):\n", + " super(RegressHate_1_notworking,self).__init__()\n", + " self.linear = nn.Linear(384,1)\n", + " self.linear.weight = torch.nn.Parameter(torch.zeros((1,384),dtype=torch.float64,requires_grad=True))\n", + " self.linear.bias = torch.nn.Parameter(torch.tensor([0],dtype=torch.float64,requires_grad=True))\n", + " self.labels = ['not_hate','implicit_hate','explicit_hate']\n", + " self.diff = []\n", + " self.output = []\n", + " return\n", + " \n", + " def forward(self,x): \n", + " self.output = self.linear(x)\n", + " return self.output\n", + " def score2class(self,a):\n", + " self.diff = torch.abs(torch.subtract(torch.tensor([0,1,2],dtype=torch.float64),torch.tensor([a,a,a],dtype=torch.float64)))\n", + " #print(self.diff)\n", + " return self.labels[torch.argmin(self.diff)]\n", + "\n", + " def _print(self):\n", + " print(\"W\",\"\\n\",self.linear.weight)\n", + " print(\"p\",\"\\n\",self.output)\n", + " return\n", + " \n", + " def _train(self,data,epochs,learning_rate):\n", + " criterion = nn.MSELoss()\n", + " torch.random.manual_seed(42) \n", + " np.random.seed(42)\n", + " optimizer = torch.optim.Adam(model.parameters(),\n", + " lr=learning_rate)\n", + " sched = StepLR(optimizer,gamma=0.3,step_size=100)\n", + " loss_avg = []\n", + " # main training loop\n", + " for epoch in range(epochs):\n", + " np.random.shuffle(data)\n", + " loss_val=[]\n", + " #self._print()\n", + " for batch, (X, y) in enumerate(data[:300]):\n", + " #print(y)\n", + " result = model.forward(X)\n", + " loss = criterion(result,y)\n", + " optimizer.zero_grad()\n", + " loss_val.append(loss.item())\n", + " loss.backward()\n", + " optimizer.step()\n", + " loss_avg.append(np.mean(loss_val))\n", + " sched.step()\n", + " \n", + " plt.figure()\n", + " plt.plot(loss_avg, '-')\n", + " plt.ylabel('loss')\n", + " plt.xlabel('epoch')\n", + " plt.show()\n", + " return loss_avg\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Training" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/temp/Library/Python/3.9/lib/python/site-packages/torch/nn/modules/loss.py:535: UserWarning:\n", + "\n", + "Using a target size (torch.Size([])) that is different to the input size (torch.Size([1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + "\n" + ] + }, + { + "data": { + "image/png": "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f39p5cqVsW5SnQJA87+33nrLt01ZWZl0++23S40aNZLq1asnXX755dKhQ4cU+9m7d680atQoKT09XWrSpIl03333SVVVVVF+NXWLOrjh+2ydL774QurVq5fkcrmk0047TXr11VcV93u9XmnKlClSTk6O5HK5pAsuuEDavn27YpsTJ05I1157rdSgQQMpMzNTuvHGG6WioqJovoy4VlhYKN19991S27ZtpbS0NKljx47So48+qhhezPc5eD/88IPmMXn8+PGSJFn3nm7atEkaMmSI5HK5pFatWklPPfWUJe23SZIwjSMRERFRHceaGyIiIkooDG6IiIgooTC4ISIiooTC4IaIiIgSCoMbIiIiSigMboiIiCihMLghIiKihMLghoiIiBIKgxsiSnqLFy+GzWbzWzCUiOomBjdERESUUBjcEBERUUJhcENEMef1ejFjxgx06NAB6enp6NOnDz7++GMAtV1G8+fPx+mnn460tDScffbZ2LJli2Ifn3zyCXr27AmXy4X27dvjmWeeUdxfUVGBhx56CG3atIHL5ULnzp3xxhtvKLZZt24d+vXrh3r16mHQoEHYvn17ZF84EUUEgxsiirkZM2bg7bffxiuvvIKtW7fi3nvvxZ///GcsWbLEt80DDzyAZ555BmvWrEHTpk0xZswYVFVVAagOSq666ipcc8012Lx5M/72t79hypQpmD17tu/x119/PT744APMmjUL27Ztw3/+8x80aNBA0Y5HH30UzzzzDNauXQun04kJEyZE5fUTkbW4KjgRxVRFRQWys7Px/fffY+DAgb7bb775ZpSWluLWW2/FsGHDMGfOHFx99dUAgJMnT6J169aYPXs2rrrqKowbNw7Hjh3Dd99953v8gw8+iPnz52Pr1q3YsWMHunXrhgULFmD48OF+bVi8eDGGDRuG77//HhdccAEA4KuvvsLo0aNRVlaGtLS0CL8LRGQlZm6IKKZ27dqF0tJSjBgxAg0aNPD99/bbb+O3337zbScGPtnZ2ejWrRu2bdsGANi2bRsGDx6s2O/gwYOxc+dOeDwebNy4EQ6HA+edd55hW04//XTf3y1atAAAHD16NOzXSETR5Yx1A4gouRUXFwMA5s+fj1atWinuc7lcigAnVOnp6aa2S0lJ8f1ts9kAVNcDEVHdwswNEcVUjx494HK5kJeXh86dOyv+a9OmjW+7lStX+v4+deoUduzYge7duwMAunfvjuXLlyv2u3z5cnTt2hUOhwO9e/eG1+tV1PAQUeJi5oaIYiojIwP3338/7r33Xni9XgwZMgQFBQVYvnw5MjMz0a5dOwDA448/jsaNGyMnJwePPvoomjRpgssuuwwAcN999+Gss87C9OnTcfXVV2PFihV44YUX8NJLLwEA2rdvj/Hjx2PChAmYNWsW+vTpg3379uHo0aO46qqrYvXSiShCGNwQUcxNnz4dTZs2xYwZM7B7925kZWWhb9++eOSRR3zdQk899RTuvvtu7Ny5E2eccQa++OILpKamAgD69u2LDz/8EFOnTsX06dPRokULPP7447jhhht8z/Hyyy/jkUcewe23344TJ06gbdu2eOSRR2LxcokowjhaiojimjyS6dSpU8jKyop1c4ioDmDNDRERESUUBjdERESUUNgtRURERAmFmRsiIiJKKAxuiIiIKKEwuCEiIqKEwuCGiIiIEgqDGyIiIkooDG6IiIgooTC4ISIiooTC4IaIiIgSyv8DopQTlzlvRL0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model = RegressHate_1_notworking()\n", + "loss = model._train(m2train_data1,1000, 0.00001)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing" + ] + }, + { + "cell_type": "code", + "execution_count": 233, + "metadata": {}, + "outputs": [], + "source": [ + "lindict_rev = dict([(l[1],l[0]) for l in lindict.items()])" + ] + }, + { + "cell_type": "code", + "execution_count": 234, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: 'not_hate', 1: 'implicit_hate', 2: 'explicit_hate'}" + ] + }, + "execution_count": 234, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lindict_rev" + ] + }, + { + "cell_type": "code", + "execution_count": 235, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trained 99\n", + "untrained 88\n" + ] + } + ], + "source": [ + "correct = 0\n", + "scoresmart = []\n", + "ysmart = []\n", + "predicted = []\n", + "actual_labelsmart = []\n", + "for x,y in m2test_data1:\n", + " score = model.forward(x)\n", + " results = model.score2class(score.item())\n", + " if results == lindict_rev[y.item()]:\n", + " correct+=1\n", + " scoresmart.append(score.item())\n", + " ysmart.append(y.item())\n", + " actual_labelsmart.append(lindict_rev[(y.item())])\n", + " predicted.append(results)\n", + "print('trained', correct)\n", + "\n", + "stupid_model = RegressHate_1_notworking()\n", + "correct = 0\n", + "scorestupid = []\n", + "ystupid = []\n", + "actual_labelstupid = []\n", + "for x,y in m2test_data1:\n", + " score = stupid_model.forward(x)\n", + " results = stupid_model.score2class(score.item())\n", + " if results == lindict_rev[y.item()]:\n", + " correct+=1\n", + " scorestupid.append(score.item())\n", + " ystupid.append(y.item())\n", + " actual_labelstupid.append(lindict_rev[y.item()])\n", + "print(\"untrained\",correct)" + ] + }, + { + "cell_type": "code", + "execution_count": 236, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/temp/Library/Python/3.9/lib/python/site-packages/plotly/express/_core.py:1980: FutureWarning:\n", + "\n", + "When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.\n", + "\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "color=not_hate
predicted=%{x}
actual=%{y}", + "legendgroup": "not_hate", + "marker": { + "color": "#636efa", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "not_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0.16035675891767465, + -0.4358102552263937, + 0.3364597910459949, + -0.42585245258538584, + 0.420707710052567, + 0.5915241372598309, + -0.43961452085662855, + -0.06771860214620418, + -0.7432410007286251, + -0.028074243548861677, + 0.48981412091015125, + 0.6080704514948687, + -0.18655846335291915, + 1.032575052282842, + -0.5255903022675935, + -0.3238618757057282, + -0.11014340315932175, + 0.4773585437141932, + 0.04178166604997491, + 0.014621174828060524, + 0.3365987659312701, + 0.10580941718836151, + 0.12588371735522147, + -0.1817453214263166, + -0.8040449832534661, + 0.36021866814334946, + 0.5035946385938074, + -0.4849257954104128, + -0.47050744385406984, + 0.13765829720150202, + 0.10921413091741411, + -0.5168749901220638, + 0.11433020920708686, + -0.35172598512517894, + -0.7899548222866292, + -0.635164023125546, + 0.22750216548129587, + 0.0612832493261426, + -0.2643597885154375, + 0.5518016395644527, + -0.10011806340522139, + -0.02194338952592023, + 0.3832251796028899, + 0.8891614409298639, + 0.20294682676758413, + 0.5661708172565216, + -0.6608537285908082, + 0.10758366447231815, + 0.22965934416736428, + 0.2770483773384551, + -0.21659826377654923, + -0.35992647215200424, + 0.2913523869713664, + -0.2600245383149339, + 0.5163609138800375, + -0.3102443806395697, + 0.13065654349406702, + -0.383287611407677, + 0.7311922926879553, + 0.1865126051073295, + 0.15079102761858487, + -0.16581245410163886, + 0.4613402144890097, + -0.1271923266297963, + -0.17584049651938283, + 0.2157427858127353, + 0.37729755337499904, + -0.4198927563016732, + -0.44375480518678356, + -0.25665085531152354, + -0.09114856585981246, + -0.23204990451361163, + 0.37695381494423563, + 0.05496728105408011, + 0.20442216795959484, + 0.11814014269652046, + 0.2970228443441756, + -0.06750847535379889, + -0.041084321323030526, + 0.006101441589639989, + 0.19297706421261004, + -0.11454311812369794, + -0.3674885266209623, + 0.020427728188674665, + 0.6358700873101288, + -0.09981658514422875, + -0.21114019868441436, + 0.09183948801488728 + ], + "xaxis": "x", + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "yaxis": "y" + }, + { + "hovertemplate": "color=explicit_hate
predicted=%{x}
actual=%{y}", + "legendgroup": "explicit_hate", + "marker": { + "color": "#EF553B", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "explicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0.36105235144090003, + 1.1169971199315993, + 0.9169292345759871, + 0.27629661770921343, + 1.2421154401172112, + 1.0576991924403125, + 0.8579761290310318, + 0.6427355440063591, + 0.6638201478208526, + 0.6266419378138887, + 0.8860875113761573, + 1.0134943742066822, + 1.0693183244420164, + 0.8850167466937262, + 0.37317992328387956, + 0.5879792679227681, + 1.5656528949859623, + 0.306993157560975, + 0.3384401360845384, + 1.2336780119030712, + 1.118445250618354, + 0.8453855865346768, + 1.3384114509220173, + 0.2053059430058402, + 0.6707189270562632, + -0.12091332648206976, + 0.902828502045922, + 0.7221681515229039, + 0.8100671144962154, + 0.20076692370251256, + 1.0258698516601652, + 0.23258919987470664, + 0.9098053751563051, + 0.49581832246942203, + 0.5753530426968232, + 0.26700307634744463, + 0.5705100400247779, + 0.3385922831762018, + 0.06750496398423961, + 0.6247116906673327, + 1.2749627649005508, + 0.8088804401800468, + 0.4577370358706756, + 0.3900702710738808, + 0.3601823729388418, + 0.3442698753650813, + 0.3442698753650813, + 0.8626635515252479, + 0.10895225563418631, + 0.6859350075034776, + 0.9539867608369803, + 1.2727920218209454, + 0.6003904023765595, + 1.3201957545313578, + 0.3751511127687787, + 0.6844345078041665, + 0.5983109269506313, + 1.0690831879901874, + 0.3173444821384711, + 1.266068571371731, + 0.03213040226445296, + 1.0492450097104609, + 0.6106505444590633, + 0.535494144010115, + 0.11169938137827634, + 0.4595120287859242, + 0.2746139702709219, + 0.3589111148421409, + 1.0592550317833593, + -0.0777781289163999, + 0.6575145542286605, + 0.2885695867787241, + 0.6478596079830649, + 0.5992312492665818, + 1.266487681514508, + 0.3712523230695881, + 1.3064951499302417, + 1.1288030932416122, + 0.8918786856967136, + 0.07769962617257098, + 0.40579333917687066, + 0.3359414490999735, + 0.4918354556650801, + 0.47451101724724964, + 0.02546613105200929, + 0.6202478582484521, + 0.9464684397626306, + 0.8028303101465508 + ], + "xaxis": "x", + "y": [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + "yaxis": "y" + }, + { + "hovertemplate": "color=implicit_hate
predicted=%{x}
actual=%{y}", + "legendgroup": "implicit_hate", + "marker": { + "color": "#00cc96", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "implicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0.5898812299997369, + 0.214306345130267, + 0.30783739629936135, + 1.0958859681220277, + 0.431889382132713, + -0.06888770880406941, + 0.49407686310192467, + 0.11966021187118353, + 0.3015164167936573, + -0.5199346412935578, + 0.2867723707639701, + 0.12915832064302785, + 0.3233374643223569, + 0.27399636038996705, + 0.39983046563836777, + 0.2339546479786015, + 0.0780282470803659, + 0.6928297868085302, + 0.32013071155384404, + 0.20953264982765454, + 0.6474651739731974, + 0.3394818446369514, + -0.07066247317178265, + 0.19302006820700557, + 0.25822897831046665, + 0.36468787075122344, + 0.22047887112371703, + 0.663260137487819, + 0.6194266282739027, + 0.4849204535540079, + 0.17893486122404406, + 0.10855156919278666, + 0.36833682236624654, + 0.14483528130371212, + 0.317324088732275, + 0.10012538498804807, + 0.5753876390460311, + -0.04551325065977696, + 0.7289068670939813, + 0.3783431433952439, + 0.3001497481367953, + -0.015341090114998623, + 0.7088550857564393, + 0.22527191189237233, + 0.7023093528316217, + 0.4255981591245207, + 0.2652832320689187, + -0.08781538348150336, + 0.4261357266755803, + 1.0603157532151748, + -0.310134609053319, + 0.5482478701995148, + 0.1161781964469476, + 0.12223598897599894, + -0.28006430954531036, + 0.3881366285463905, + 0.93281240911271, + -0.06979617893209528, + 0.44526888581301716, + 0.6770385151708325, + -0.25784413337238987, + 0.4197644031356975, + 0.3203320542912545, + 0.3272635724530454, + 0.5030123669669582, + -0.33191602253667296, + -0.009749564866072757, + 0.4661523646762296, + 0.7829320249963685, + 0.9417377800470655, + 0.4183914322793088, + 0.04419799972844096, + 0.38212210599493446, + 0.13091650510569638, + 0.39242216232928895, + 0.31341055518752586, + 0.44141768516077245, + -0.047841493811398406, + 0.7554862306414101, + 0.5275505454720456, + 0.19396223923236208, + 0.03949431551434085, + -0.03100964260364608, + 0.05979605488959605, + 0.22948283243012027, + 0.03445295056144376, + -0.026921056379422326, + 0.7245383161375342 + ], + "xaxis": "x", + "y": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "color" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "predicted" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "actual" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rdfsmart = pd.DataFrame()\n", + "rdfsmart['predicted'] = scoresmart\n", + "rdfsmart['actual'] = ysmart\n", + "rdfsmart['color'] = actual_labelsmart\n", + "fig = px.scatter(rdfsmart, x='predicted', y='actual',\n", + " color='color',size_max=.01,opacity=0.4)\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 237, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/temp/Library/Python/3.9/lib/python/site-packages/plotly/express/_core.py:1980: FutureWarning:\n", + "\n", + "When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.\n", + "\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "color=not_hate
predicted=%{x}
actual=%{y}", + "legendgroup": "not_hate", + "marker": { + "color": "#636efa", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "not_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "xaxis": "x", + "y": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "yaxis": "y" + }, + { + "hovertemplate": "color=explicit_hate
predicted=%{x}
actual=%{y}", + "legendgroup": "explicit_hate", + "marker": { + "color": "#EF553B", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "explicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "xaxis": "x", + "y": [ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2 + ], + "yaxis": "y" + }, + { + "hovertemplate": "color=implicit_hate
predicted=%{x}
actual=%{y}", + "legendgroup": "implicit_hate", + "marker": { + "color": "#00cc96", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "implicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "xaxis": "x", + "y": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "color" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "predicted" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "actual" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "rdfstupid = pd.DataFrame()\n", + "rdfstupid['predicted'] = scorestupid\n", + "rdfstupid['actual'] = ystupid\n", + "rdfstupid['color'] = actual_labelstupid\n", + "fig = px.scatter(rdfstupid, x='predicted', y='actual',\n", + " color='color',size_max=.01,opacity=0.4)\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parameter containing:\n", + "tensor([0.3261], dtype=torch.float64, requires_grad=True)\n" + ] + } + ], + "source": [ + "print(model.linear.bias)" + ] + }, + { + "cell_type": "code", + "execution_count": 239, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "actual pred_num\n", + "0.0 0 78\n", + "1.0 0 68\n", + "2.0 1 52\n", + " 0 35\n", + "1.0 1 20\n", + "0.0 1 10\n", + "2.0 2 1\n", + "Name: count, dtype: int64" + ] + }, + "execution_count": 239, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rdfsmart['pred_num'] = [(lindict[y]) for y in predicted]\n", + "rdfsmart.value_counts([\"actual\",\"pred_num\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/4z/bnyz3w2s6lg97h_fm4lt5ksr0000gn/T/ipykernel_1280/2638514855.py:1: DeprecationWarning:\n", + "\n", + "an integer is required (got type float). Implicit conversion to integers using __int__ is deprecated, and may be removed in a future version of Python.\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[78, 10, 0],\n", + " [68, 20, 0],\n", + " [35, 52, 1]])" + ] + }, + "execution_count": 240, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "multiclass_confusion_matrix(torch.tensor([(lindict[y]) for y in predicted],dtype=torch.int64),torch.tensor([(y) for y in ysmart],dtype=torch.int64),3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

2-pc regression

" + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "metadata": {}, + "outputs": [], + "source": [ + "class Hate2pc_Lin(nn.Module):\n", + " def __init__(self):\n", + " super(Hate2pc_Lin,self).__init__()\n", + " self.linear1 = nn.Linear(384,1)\n", + " self.linear1.weight = torch.nn.Parameter(torch.zeros((1,384),dtype=torch.float64,requires_grad=True))\n", + " self.linear1.bias = torch.nn.Parameter(torch.tensor([0],dtype=torch.float64,requires_grad=True))\n", + "\n", + " self.linear2 = nn.Linear(384,1)\n", + " self.linear2.weight = torch.nn.Parameter(torch.zeros((1,384),dtype=torch.float64,requires_grad=True))\n", + " self.linear2.bias = torch.nn.Parameter(torch.tensor([0],dtype=torch.float64,requires_grad=True))\n", + " \n", + " self.hate = torch.tensor([1],dtype=torch.float64,requires_grad=True)\n", + " self.nothate = torch.tensor([1],dtype=torch.float64,requires_grad=True)\n", + " self.S = torch.tensor([1],dtype=torch.float64,requires_grad=True)\n", + "\n", + " self.labels = ['not_hate','implicit_hate','explicit_hate']\n", + " self.diff = []\n", + " self.output = torch.tensor([1],dtype=torch.float64,requires_grad=True)\n", + " return\n", + " \n", + " def forward(self,x): \n", + " self.hate = self.linear1(x)\n", + " self.nothate = self.linear2(x)\n", + " self.S = torch.subtract(self.hate,self.nothate)\n", + " \n", + " return self.S,self.nothate,self.hate\n", + "\n", + " def score2class(self,y):\n", + " self.diff = torch.abs(torch.subtract(torch.tensor([0,1,2],dtype=torch.float64),torch.tensor([y,y,y],dtype=torch.float64)))\n", + " return self.labels[torch.argmin(self.diff)]\n", + " \n", + " def _print(self):\n", + " print(\"W1\",\"\\n\",self.linear1.weight)\n", + " print(\"W2\",\"\\n\",self.linear2.weight)\n", + " print(\"S\",\"\\n\",self.S)\n", + " print(\"hate\",\"\\n\",self.hate)\n", + " print(\"not hate\",\"\\n\",self.nothate)\n", + " return\n", + " def _train(self,data,epochs,learning_rate):\n", + " criterion = nn.MSELoss()\n", + " torch.random.manual_seed(42) \n", + " np.random.seed(42)\n", + " optimizer = torch.optim.Adam(self.parameters(),\n", + " lr=learning_rate)\n", + " sched = StepLR(optimizer,gamma=0.3,step_size=100)\n", + " loss_val = []\n", + " # main training loop\n", + " for epoch in range(epochs):\n", + " np.random.shuffle(data)\n", + " #self._print()\n", + " losses = []\n", + " for batch, (X, y) in enumerate(data[:300]):\n", + " #print(y)\n", + " result = self.forward(X)\n", + " loss = criterion(result[0],y)\n", + " optimizer.zero_grad()\n", + " loss.backward() # computes all the gradients\n", + " optimizer.step()\n", + " losses.append(loss.item())\n", + " loss_val.append(np.mean(losses))\n", + " sched.step()\n", + " plt.figure()\n", + " plt.plot(loss_val, '-')\n", + " plt.ylabel('loss')\n", + " plt.xlabel('epoch')\n", + " plt.show()\n", + " return loss_val\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 242, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/temp/Library/Python/3.9/lib/python/site-packages/torch/nn/modules/loss.py:535: UserWarning:\n", + "\n", + "Using a target size (torch.Size([])) that is different to the input size (torch.Size([1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n", + "\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model = Hate2pc_Lin()\n", + "loss = model._train(m2train_data1,1000, 0.00001)" + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trained 133\n", + "untrained 88\n" + ] + } + ], + "source": [ + "correct = 0\n", + "scoresmart = []\n", + "predicted = []\n", + "actual = []\n", + "d1 = []\n", + "d2 = []\n", + "for x,y in m2test_data1:\n", + " score = model.forward(x)\n", + " results = model.score2class(score[0].item())\n", + " if results == lindict_rev[y.item()]:\n", + " correct+=1\n", + " scoresmart.append(score[0].item())\n", + " actual.append(model.score2class(y.item()))\n", + " predicted.append(results)\n", + " d1.append(score[1].item())\n", + " d2.append(score[2].item())\n", + "\n", + "print(\"trained\",correct)\n", + "\n", + "stupid_model = RegressHate_1_notworking()\n", + "correct = 0\n", + "scorestupid = []\n", + "ystupid = []\n", + "resultstupid = []\n", + "for x,y in m2test_data1:\n", + " score = stupid_model.forward(x)\n", + " result = stupid_model.score2class(score.item())\n", + " if result == lindict_rev[y.item()]:\n", + " correct+=1\n", + " scorestupid.append(score.item())\n", + " ystupid.append(y.item())\n", + " actual_labelstupid.append(lindict_rev[y.item()])\n", + "print(\"untrained\",correct)" + ] + }, + { + "cell_type": "code", + "execution_count": 244, + "metadata": {}, + "outputs": [], + "source": [ + "df2pc = pd.DataFrame()\n", + "df2pc['d1'] = d1\n", + "df2pc['d2'] = d2\n", + "df2pc['actual'] = actual\n", + "df2pc['predicted'] = predicted" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/temp/Library/Python/3.9/lib/python/site-packages/plotly/express/_core.py:1980: FutureWarning:\n", + "\n", + "When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.\n", + "\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "actual=not_hate
d1=%{x}
d2=%{y}", + "legendgroup": "not_hate", + "marker": { + "color": "#636efa", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "not_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + -0.21517429923295334, + 0.06861528132066413, + -0.2707043186744422, + 0.07183780152801106, + -0.2966169160749341, + -0.41801648992267093, + 0.1337451115987246, + -0.06949764481062093, + 0.2817173180046107, + -0.07142049263784062, + -0.3214742283946723, + -0.4200908483645569, + 0.014225006506886517, + -0.7149290704011888, + 0.16008444017147916, + 0.13323962072790974, + -0.08283730216545909, + -0.3272770546038512, + -0.10468201130106924, + -0.11411636862103244, + -0.23101182474066917, + -0.21686444295003257, + -0.1302441643372812, + 0.002759550371192687, + 0.2937901704152693, + -0.27763597640106663, + -0.3836389694293827, + 0.13426897262183696, + 0.11490126575175358, + -0.20439945868241868, + -0.11639273151516621, + 0.15848477123218435, + -0.20899101409377435, + 0.12699153118766932, + 0.31773884176624306, + 0.2645616535564648, + -0.2415623693991551, + -0.2065101702499391, + 0.002336582731180259, + -0.40378644396917895, + -0.1155300898697206, + -0.1347047141317747, + -0.27804653350502984, + -0.5947776008635326, + -0.33207248201267037, + -0.40391746763295555, + 0.2618093854475921, + -0.08327897259164985, + -0.21487159747027818, + -0.21290508128360522, + 0.024343804696400906, + 0.05259147888905141, + -0.33608274662775917, + 0.02488862259057878, + -0.4215612369917683, + 0.04249713972351937, + -0.11507139631328597, + 0.1055240980886265, + -0.5105084511208229, + -0.21256452854235997, + -0.23312810821838068, + -0.054218702425683024, + -0.41958626878555816, + -0.05643387941634026, + 0.10898773898505348, + -0.23334608052215502, + -0.30216341444115247, + 0.04824969297528775, + 0.12619456989925631, + 0.031071376353725588, + -0.018770258374503246, + 0.008931690833840655, + -0.36782168753515904, + -0.08359716920352353, + -0.26351787080314276, + -0.2681001561952002, + -0.2639808172464422, + -0.03446632701634017, + -0.09998624091313277, + -0.11132463710353002, + -0.2460949932719192, + -0.0025721249572707716, + 0.05563486684166252, + -0.09429538633760448, + -0.4987650428902119, + -0.08827841153323834, + -0.004457162777428525, + -0.2484444255917958 + ], + "xaxis": "x", + "y": [ + 0.21517429923295334, + -0.06861528132066413, + 0.2707043186744422, + -0.07183780152801106, + 0.2966169160749341, + 0.41801648992267093, + -0.1337451115987246, + 0.06949764481062093, + -0.2817173180046107, + 0.07142049263784062, + 0.3214742283946723, + 0.4200908483645569, + -0.014225006506886517, + 0.7149290704011888, + -0.16008444017147916, + -0.13323962072790974, + 0.08283730216545909, + 0.3272770546038512, + 0.10468201130106924, + 0.11411636862103244, + 0.23101182474066917, + 0.21686444295003257, + 0.1302441643372812, + -0.002759550371192687, + -0.2937901704152693, + 0.27763597640106663, + 0.3836389694293827, + -0.13426897262183696, + -0.11490126575175358, + 0.20439945868241868, + 0.11639273151516621, + -0.15848477123218435, + 0.20899101409377435, + -0.12699153118766932, + -0.31773884176624306, + -0.2645616535564648, + 0.2415623693991551, + 0.2065101702499391, + -0.002336582731180259, + 0.40378644396917895, + 0.1155300898697206, + 0.1347047141317747, + 0.27804653350502984, + 0.5947776008635326, + 0.33207248201267037, + 0.40391746763295555, + -0.2618093854475921, + 0.08327897259164985, + 0.21487159747027818, + 0.21290508128360522, + -0.024343804696400906, + -0.05259147888905141, + 0.33608274662775917, + -0.02488862259057878, + 0.4215612369917683, + -0.04249713972351937, + 0.11507139631328597, + -0.1055240980886265, + 0.5105084511208229, + 0.21256452854235997, + 0.23312810821838068, + 0.054218702425683024, + 0.41958626878555816, + 0.05643387941634026, + -0.10898773898505348, + 0.23334608052215502, + 0.30216341444115247, + -0.04824969297528775, + -0.12619456989925631, + -0.031071376353725588, + 0.018770258374503246, + -0.008931690833840655, + 0.36782168753515904, + 0.08359716920352353, + 0.26351787080314276, + 0.2681001561952002, + 0.2639808172464422, + 0.03446632701634017, + 0.09998624091313277, + 0.11132463710353002, + 0.2460949932719192, + 0.0025721249572707716, + -0.05563486684166252, + 0.09429538633760448, + 0.4987650428902119, + 0.08827841153323834, + 0.004457162777428525, + 0.2484444255917958 + ], + "yaxis": "y" + }, + { + "hovertemplate": "actual=explicit_hate
d1=%{x}
d2=%{y}", + "legendgroup": "explicit_hate", + "marker": { + "color": "#EF553B", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "explicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + -0.31878736810997854, + -0.8179370028503732, + -0.6184821136566773, + -0.2959040730750945, + -0.8207357104560331, + -0.7586899708348946, + -0.6261220460876841, + -0.5175971101613311, + -0.5146843348541545, + -0.4783517711440948, + -0.642988204236004, + -0.7082645973014683, + -0.6902906058964169, + -0.6941248033616796, + -0.36765631852504255, + -0.3644773362950804, + -1.0712600366205676, + -0.3491314265407057, + -0.23113347401550452, + -0.8169340992722887, + -0.7703339166295464, + -0.5599224543197932, + -0.876481931875819, + -0.18377294512115014, + -0.4751397876985796, + -0.07333579981691174, + -0.5765862191736209, + -0.503524720618984, + -0.5597155049341067, + -0.19817169735930018, + -0.6667547177249931, + -0.24641184636140195, + -0.6929512378103678, + -0.3939070230878239, + -0.41009452016120673, + -0.27580223152523337, + -0.3861437128112625, + -0.28717842465090215, + -0.1390767303233527, + -0.49019137962483983, + -0.8264632778084697, + -0.581587834748273, + -0.32825481487056585, + -0.3069890714193381, + -0.30445614724361114, + -0.2888787041261237, + -0.2888787041261237, + -0.6128627393994648, + -0.16107372436824172, + -0.45201063689086146, + -0.6581208032117369, + -0.8778079345335903, + -0.48405732735048634, + -0.8808971254704396, + -0.37713607375686925, + -0.49289803865292026, + -0.440946535210497, + -0.7832173727594955, + -0.2824677932568395, + -0.8811369515077612, + -0.05851292744573372, + -0.6789043646181316, + -0.4518983475550644, + -0.4676558964391659, + -0.2211356809963292, + -0.3731288705388124, + -0.17490320420359257, + -0.29698684716812335, + -0.7646216502873611, + -0.040270617181656754, + -0.4376248697629419, + -0.21591788423753205, + -0.4660829937845231, + -0.42129912928982105, + -0.7861380620561693, + -0.2995579701772697, + -0.8853289589513638, + -0.7809534025438851, + -0.6082313745353052, + -0.17282391699924, + -0.4274473064292218, + -0.3240429385139405, + -0.39417091960719697, + -0.3960313365429852, + -0.11100601843823382, + -0.5013929322303506, + -0.6464648945101195, + -0.6054022616849934 + ], + "xaxis": "x", + "y": [ + 0.31878736810997854, + 0.8179370028503732, + 0.6184821136566773, + 0.2959040730750945, + 0.8207357104560331, + 0.7586899708348946, + 0.6261220460876841, + 0.5175971101613311, + 0.5146843348541545, + 0.4783517711440948, + 0.642988204236004, + 0.7082645973014683, + 0.6902906058964169, + 0.6941248033616796, + 0.36765631852504255, + 0.3644773362950804, + 1.0712600366205676, + 0.3491314265407057, + 0.23113347401550452, + 0.8169340992722887, + 0.7703339166295464, + 0.5599224543197932, + 0.876481931875819, + 0.18377294512115014, + 0.4751397876985796, + 0.07333579981691174, + 0.5765862191736209, + 0.503524720618984, + 0.5597155049341067, + 0.19817169735930018, + 0.6667547177249931, + 0.24641184636140195, + 0.6929512378103678, + 0.3939070230878239, + 0.41009452016120673, + 0.27580223152523337, + 0.3861437128112625, + 0.28717842465090215, + 0.1390767303233527, + 0.49019137962483983, + 0.8264632778084697, + 0.581587834748273, + 0.32825481487056585, + 0.3069890714193381, + 0.30445614724361114, + 0.2888787041261237, + 0.2888787041261237, + 0.6128627393994648, + 0.16107372436824172, + 0.45201063689086146, + 0.6581208032117369, + 0.8778079345335903, + 0.48405732735048634, + 0.8808971254704396, + 0.37713607375686925, + 0.49289803865292026, + 0.440946535210497, + 0.7832173727594955, + 0.2824677932568395, + 0.8811369515077612, + 0.05851292744573372, + 0.6789043646181316, + 0.4518983475550644, + 0.4676558964391659, + 0.2211356809963292, + 0.3731288705388124, + 0.17490320420359257, + 0.29698684716812335, + 0.7646216502873611, + 0.040270617181656754, + 0.4376248697629419, + 0.21591788423753205, + 0.4660829937845231, + 0.42129912928982105, + 0.7861380620561693, + 0.2995579701772697, + 0.8853289589513638, + 0.7809534025438851, + 0.6082313745353052, + 0.17282391699924, + 0.4274473064292218, + 0.3240429385139405, + 0.39417091960719697, + 0.3960313365429852, + 0.11100601843823382, + 0.5013929322303506, + 0.6464648945101195, + 0.6054022616849934 + ], + "yaxis": "y" + }, + { + "hovertemplate": "actual=implicit_hate
d1=%{x}
d2=%{y}", + "legendgroup": "implicit_hate", + "marker": { + "color": "#00cc96", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "implicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + -0.4093193591802709, + -0.30108887061613326, + -0.29169493283312686, + -0.6859210143871266, + -0.3659491227241112, + -0.07944034247113946, + -0.360798305414831, + -0.1109375405735736, + -0.2981633259804458, + 0.12810719660826037, + -0.26589029498867656, + -0.11525344442195062, + -0.29516624069649444, + -0.25182296669311593, + -0.2917980341020479, + -0.26722968292406624, + -0.15176441998639417, + -0.5776124809516581, + -0.30123364511649137, + -0.25229313909897444, + -0.5005986830635875, + -0.3274331447942461, + -0.09576327527470466, + -0.23599031868533632, + -0.21404281429593128, + -0.3391119525567261, + -0.19537285887472294, + -0.4948234662275989, + -0.4438136938551814, + -0.33779703387045856, + -0.15729613349811133, + -0.14973972819326334, + -0.3423960856835379, + -0.20071911306994838, + -0.2558115948259158, + -0.1848562312926021, + -0.4914889012401019, + -0.08583329836879267, + -0.5061824314910568, + -0.35102477418711675, + -0.2610801146450894, + -0.16936579509130661, + -0.4809997229572389, + -0.20510923802164455, + -0.4947486950092427, + -0.33715483463027573, + -0.23674596128240452, + -0.09631934370284978, + -0.2890352539412861, + -0.709471058272684, + 0.10001849201401536, + -0.4023185717754495, + -0.19710340665849052, + -0.20013412433684577, + 0.02422901972362901, + -0.3725345947465836, + -0.7147301640569865, + -0.04352792510652642, + -0.365546119743994, + -0.43725919075013236, + 0.05704932183688671, + -0.3324623296104486, + -0.32368976776340275, + -0.282612283356054, + -0.359582109744911, + 0.04197053087528857, + -0.09623550775627943, + -0.4297459873782855, + -0.5080375764949785, + -0.6425579549719145, + -0.33574688027368216, + -0.18569156574563897, + -0.3243865312052645, + -0.2040879058798183, + -0.35862728969092755, + -0.30099443637522266, + -0.3743717918646966, + -0.11665622746418869, + -0.48747467464580885, + -0.3563680746249608, + -0.15748403031349273, + -0.15753635836418958, + -0.05837910246662956, + -0.13399989744949703, + -0.2673982567659193, + -0.11830470525362613, + -0.12731458918788432, + -0.46676843205718255 + ], + "xaxis": "x", + "y": [ + 0.4093193591802709, + 0.30108887061613326, + 0.29169493283312686, + 0.6859210143871266, + 0.3659491227241112, + 0.07944034247113946, + 0.360798305414831, + 0.1109375405735736, + 0.2981633259804458, + -0.12810719660826037, + 0.26589029498867656, + 0.11525344442195062, + 0.29516624069649444, + 0.25182296669311593, + 0.2917980341020479, + 0.26722968292406624, + 0.15176441998639417, + 0.5776124809516581, + 0.30123364511649137, + 0.25229313909897444, + 0.5005986830635875, + 0.3274331447942461, + 0.09576327527470466, + 0.23599031868533632, + 0.21404281429593128, + 0.3391119525567261, + 0.19537285887472294, + 0.4948234662275989, + 0.4438136938551814, + 0.33779703387045856, + 0.15729613349811133, + 0.14973972819326334, + 0.3423960856835379, + 0.20071911306994838, + 0.2558115948259158, + 0.1848562312926021, + 0.4914889012401019, + 0.08583329836879267, + 0.5061824314910568, + 0.35102477418711675, + 0.2610801146450894, + 0.16936579509130661, + 0.4809997229572389, + 0.20510923802164455, + 0.4947486950092427, + 0.33715483463027573, + 0.23674596128240452, + 0.09631934370284978, + 0.2890352539412861, + 0.709471058272684, + -0.10001849201401536, + 0.4023185717754495, + 0.19710340665849052, + 0.20013412433684577, + -0.02422901972362901, + 0.3725345947465836, + 0.7147301640569865, + 0.04352792510652642, + 0.365546119743994, + 0.43725919075013236, + -0.05704932183688671, + 0.3324623296104486, + 0.32368976776340275, + 0.282612283356054, + 0.359582109744911, + -0.04197053087528857, + 0.09623550775627943, + 0.4297459873782855, + 0.5080375764949785, + 0.6425579549719145, + 0.33574688027368216, + 0.18569156574563897, + 0.3243865312052645, + 0.2040879058798183, + 0.35862728969092755, + 0.30099443637522266, + 0.3743717918646966, + 0.11665622746418869, + 0.48747467464580885, + 0.3563680746249608, + 0.15748403031349273, + 0.15753635836418958, + 0.05837910246662956, + 0.13399989744949703, + 0.2673982567659193, + 0.11830470525362613, + 0.12731458918788432, + 0.46676843205718255 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "actual" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "d1" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "d2" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = px.scatter(df2pc, x='d1', y='d2',\n", + " color='actual',size_max=.01,opacity=0.4)\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 246, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/temp/Library/Python/3.9/lib/python/site-packages/plotly/express/_core.py:1980: FutureWarning:\n", + "\n", + "When grouping with a length-1 list-like, you will need to pass a length-1 tuple to get_group in a future version of pandas. Pass `(name,)` instead of `name` to silence this warning.\n", + "\n" + ] + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "predicted=not_hate
d1=%{x}
d2=%{y}", + "legendgroup": "not_hate", + "marker": { + "color": "#636efa", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "not_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + -0.21517429923295334, + 0.06861528132066413, + 0.07183780152801106, + 0.1337451115987246, + -0.06949764481062093, + 0.2817173180046107, + -0.07142049263784062, + 0.014225006506886517, + 0.16008444017147916, + 0.13323962072790974, + -0.08283730216545909, + -0.10468201130106924, + -0.11411636862103244, + -0.23101182474066917, + -0.21686444295003257, + -0.1302441643372812, + 0.002759550371192687, + 0.2937901704152693, + 0.13426897262183696, + 0.11490126575175358, + -0.20439945868241868, + -0.11639273151516621, + 0.15848477123218435, + -0.20899101409377435, + 0.12699153118766932, + 0.31773884176624306, + 0.2645616535564648, + -0.2415623693991551, + -0.2065101702499391, + 0.002336582731180259, + -0.1155300898697206, + -0.1347047141317747, + 0.2618093854475921, + -0.08327897259164985, + -0.21487159747027818, + -0.21290508128360522, + 0.024343804696400906, + 0.05259147888905141, + 0.02488862259057878, + 0.04249713972351937, + -0.11507139631328597, + 0.1055240980886265, + -0.21256452854235997, + -0.23312810821838068, + -0.054218702425683024, + -0.05643387941634026, + 0.10898773898505348, + -0.23334608052215502, + 0.04824969297528775, + 0.12619456989925631, + 0.031071376353725588, + -0.018770258374503246, + 0.008931690833840655, + -0.08359716920352353, + -0.03446632701634017, + -0.09998624091313277, + -0.11132463710353002, + -0.2460949932719192, + -0.0025721249572707716, + 0.05563486684166252, + -0.09429538633760448, + -0.08827841153323834, + -0.004457162777428525, + -0.2484444255917958, + -0.23113347401550452, + -0.18377294512115014, + -0.07333579981691174, + -0.19817169735930018, + -0.24641184636140195, + -0.1390767303233527, + -0.16107372436824172, + -0.05851292744573372, + -0.2211356809963292, + -0.17490320420359257, + -0.040270617181656754, + -0.21591788423753205, + -0.17282391699924, + -0.11100601843823382, + -0.07944034247113946, + -0.1109375405735736, + 0.12810719660826037, + -0.11525344442195062, + -0.15176441998639417, + -0.09576327527470466, + -0.23599031868533632, + -0.21404281429593128, + -0.19537285887472294, + -0.15729613349811133, + -0.14973972819326334, + -0.20071911306994838, + -0.1848562312926021, + -0.08583329836879267, + -0.16936579509130661, + -0.20510923802164455, + -0.23674596128240452, + -0.09631934370284978, + 0.10001849201401536, + -0.19710340665849052, + -0.20013412433684577, + 0.02422901972362901, + -0.04352792510652642, + 0.05704932183688671, + 0.04197053087528857, + -0.09623550775627943, + -0.18569156574563897, + -0.2040879058798183, + -0.11665622746418869, + -0.15748403031349273, + -0.15753635836418958, + -0.05837910246662956, + -0.13399989744949703, + -0.11830470525362613, + -0.12731458918788432 + ], + "xaxis": "x", + "y": [ + 0.21517429923295334, + -0.06861528132066413, + -0.07183780152801106, + -0.1337451115987246, + 0.06949764481062093, + -0.2817173180046107, + 0.07142049263784062, + -0.014225006506886517, + -0.16008444017147916, + -0.13323962072790974, + 0.08283730216545909, + 0.10468201130106924, + 0.11411636862103244, + 0.23101182474066917, + 0.21686444295003257, + 0.1302441643372812, + -0.002759550371192687, + -0.2937901704152693, + -0.13426897262183696, + -0.11490126575175358, + 0.20439945868241868, + 0.11639273151516621, + -0.15848477123218435, + 0.20899101409377435, + -0.12699153118766932, + -0.31773884176624306, + -0.2645616535564648, + 0.2415623693991551, + 0.2065101702499391, + -0.002336582731180259, + 0.1155300898697206, + 0.1347047141317747, + -0.2618093854475921, + 0.08327897259164985, + 0.21487159747027818, + 0.21290508128360522, + -0.024343804696400906, + -0.05259147888905141, + -0.02488862259057878, + -0.04249713972351937, + 0.11507139631328597, + -0.1055240980886265, + 0.21256452854235997, + 0.23312810821838068, + 0.054218702425683024, + 0.05643387941634026, + -0.10898773898505348, + 0.23334608052215502, + -0.04824969297528775, + -0.12619456989925631, + -0.031071376353725588, + 0.018770258374503246, + -0.008931690833840655, + 0.08359716920352353, + 0.03446632701634017, + 0.09998624091313277, + 0.11132463710353002, + 0.2460949932719192, + 0.0025721249572707716, + -0.05563486684166252, + 0.09429538633760448, + 0.08827841153323834, + 0.004457162777428525, + 0.2484444255917958, + 0.23113347401550452, + 0.18377294512115014, + 0.07333579981691174, + 0.19817169735930018, + 0.24641184636140195, + 0.1390767303233527, + 0.16107372436824172, + 0.05851292744573372, + 0.2211356809963292, + 0.17490320420359257, + 0.040270617181656754, + 0.21591788423753205, + 0.17282391699924, + 0.11100601843823382, + 0.07944034247113946, + 0.1109375405735736, + -0.12810719660826037, + 0.11525344442195062, + 0.15176441998639417, + 0.09576327527470466, + 0.23599031868533632, + 0.21404281429593128, + 0.19537285887472294, + 0.15729613349811133, + 0.14973972819326334, + 0.20071911306994838, + 0.1848562312926021, + 0.08583329836879267, + 0.16936579509130661, + 0.20510923802164455, + 0.23674596128240452, + 0.09631934370284978, + -0.10001849201401536, + 0.19710340665849052, + 0.20013412433684577, + -0.02422901972362901, + 0.04352792510652642, + -0.05704932183688671, + -0.04197053087528857, + 0.09623550775627943, + 0.18569156574563897, + 0.2040879058798183, + 0.11665622746418869, + 0.15748403031349273, + 0.15753635836418958, + 0.05837910246662956, + 0.13399989744949703, + 0.11830470525362613, + 0.12731458918788432 + ], + "yaxis": "y" + }, + { + "hovertemplate": "predicted=implicit_hate
d1=%{x}
d2=%{y}", + "legendgroup": "implicit_hate", + "marker": { + "color": "#EF553B", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "implicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + -0.2707043186744422, + -0.2966169160749341, + -0.41801648992267093, + -0.3214742283946723, + -0.4200908483645569, + -0.7149290704011888, + -0.3272770546038512, + -0.27763597640106663, + -0.3836389694293827, + -0.40378644396917895, + -0.27804653350502984, + -0.5947776008635326, + -0.33207248201267037, + -0.40391746763295555, + -0.33608274662775917, + -0.4215612369917683, + -0.5105084511208229, + -0.41958626878555816, + -0.30216341444115247, + -0.36782168753515904, + -0.26351787080314276, + -0.2681001561952002, + -0.2639808172464422, + -0.4987650428902119, + -0.31878736810997854, + -0.6184821136566773, + -0.2959040730750945, + -0.6261220460876841, + -0.5175971101613311, + -0.5146843348541545, + -0.4783517711440948, + -0.642988204236004, + -0.7082645973014683, + -0.6902906058964169, + -0.6941248033616796, + -0.36765631852504255, + -0.3644773362950804, + -0.3491314265407057, + -0.5599224543197932, + -0.4751397876985796, + -0.5765862191736209, + -0.503524720618984, + -0.5597155049341067, + -0.6667547177249931, + -0.6929512378103678, + -0.3939070230878239, + -0.41009452016120673, + -0.27580223152523337, + -0.3861437128112625, + -0.28717842465090215, + -0.49019137962483983, + -0.581587834748273, + -0.32825481487056585, + -0.3069890714193381, + -0.30445614724361114, + -0.2888787041261237, + -0.2888787041261237, + -0.6128627393994648, + -0.45201063689086146, + -0.6581208032117369, + -0.48405732735048634, + -0.37713607375686925, + -0.49289803865292026, + -0.440946535210497, + -0.2824677932568395, + -0.6789043646181316, + -0.4518983475550644, + -0.4676558964391659, + -0.3731288705388124, + -0.29698684716812335, + -0.4376248697629419, + -0.4660829937845231, + -0.42129912928982105, + -0.2995579701772697, + -0.6082313745353052, + -0.4274473064292218, + -0.3240429385139405, + -0.39417091960719697, + -0.3960313365429852, + -0.5013929322303506, + -0.6464648945101195, + -0.6054022616849934, + -0.4093193591802709, + -0.30108887061613326, + -0.29169493283312686, + -0.6859210143871266, + -0.3659491227241112, + -0.360798305414831, + -0.2981633259804458, + -0.26589029498867656, + -0.29516624069649444, + -0.25182296669311593, + -0.2917980341020479, + -0.26722968292406624, + -0.5776124809516581, + -0.30123364511649137, + -0.25229313909897444, + -0.5005986830635875, + -0.3274331447942461, + -0.3391119525567261, + -0.4948234662275989, + -0.4438136938551814, + -0.33779703387045856, + -0.3423960856835379, + -0.2558115948259158, + -0.4914889012401019, + -0.5061824314910568, + -0.35102477418711675, + -0.2610801146450894, + -0.4809997229572389, + -0.4947486950092427, + -0.33715483463027573, + -0.2890352539412861, + -0.709471058272684, + -0.4023185717754495, + -0.3725345947465836, + -0.7147301640569865, + -0.365546119743994, + -0.43725919075013236, + -0.3324623296104486, + -0.32368976776340275, + -0.282612283356054, + -0.359582109744911, + -0.4297459873782855, + -0.5080375764949785, + -0.6425579549719145, + -0.33574688027368216, + -0.3243865312052645, + -0.35862728969092755, + -0.30099443637522266, + -0.3743717918646966, + -0.48747467464580885, + -0.3563680746249608, + -0.2673982567659193, + -0.46676843205718255 + ], + "xaxis": "x", + "y": [ + 0.2707043186744422, + 0.2966169160749341, + 0.41801648992267093, + 0.3214742283946723, + 0.4200908483645569, + 0.7149290704011888, + 0.3272770546038512, + 0.27763597640106663, + 0.3836389694293827, + 0.40378644396917895, + 0.27804653350502984, + 0.5947776008635326, + 0.33207248201267037, + 0.40391746763295555, + 0.33608274662775917, + 0.4215612369917683, + 0.5105084511208229, + 0.41958626878555816, + 0.30216341444115247, + 0.36782168753515904, + 0.26351787080314276, + 0.2681001561952002, + 0.2639808172464422, + 0.4987650428902119, + 0.31878736810997854, + 0.6184821136566773, + 0.2959040730750945, + 0.6261220460876841, + 0.5175971101613311, + 0.5146843348541545, + 0.4783517711440948, + 0.642988204236004, + 0.7082645973014683, + 0.6902906058964169, + 0.6941248033616796, + 0.36765631852504255, + 0.3644773362950804, + 0.3491314265407057, + 0.5599224543197932, + 0.4751397876985796, + 0.5765862191736209, + 0.503524720618984, + 0.5597155049341067, + 0.6667547177249931, + 0.6929512378103678, + 0.3939070230878239, + 0.41009452016120673, + 0.27580223152523337, + 0.3861437128112625, + 0.28717842465090215, + 0.49019137962483983, + 0.581587834748273, + 0.32825481487056585, + 0.3069890714193381, + 0.30445614724361114, + 0.2888787041261237, + 0.2888787041261237, + 0.6128627393994648, + 0.45201063689086146, + 0.6581208032117369, + 0.48405732735048634, + 0.37713607375686925, + 0.49289803865292026, + 0.440946535210497, + 0.2824677932568395, + 0.6789043646181316, + 0.4518983475550644, + 0.4676558964391659, + 0.3731288705388124, + 0.29698684716812335, + 0.4376248697629419, + 0.4660829937845231, + 0.42129912928982105, + 0.2995579701772697, + 0.6082313745353052, + 0.4274473064292218, + 0.3240429385139405, + 0.39417091960719697, + 0.3960313365429852, + 0.5013929322303506, + 0.6464648945101195, + 0.6054022616849934, + 0.4093193591802709, + 0.30108887061613326, + 0.29169493283312686, + 0.6859210143871266, + 0.3659491227241112, + 0.360798305414831, + 0.2981633259804458, + 0.26589029498867656, + 0.29516624069649444, + 0.25182296669311593, + 0.2917980341020479, + 0.26722968292406624, + 0.5776124809516581, + 0.30123364511649137, + 0.25229313909897444, + 0.5005986830635875, + 0.3274331447942461, + 0.3391119525567261, + 0.4948234662275989, + 0.4438136938551814, + 0.33779703387045856, + 0.3423960856835379, + 0.2558115948259158, + 0.4914889012401019, + 0.5061824314910568, + 0.35102477418711675, + 0.2610801146450894, + 0.4809997229572389, + 0.4947486950092427, + 0.33715483463027573, + 0.2890352539412861, + 0.709471058272684, + 0.4023185717754495, + 0.3725345947465836, + 0.7147301640569865, + 0.365546119743994, + 0.43725919075013236, + 0.3324623296104486, + 0.32368976776340275, + 0.282612283356054, + 0.359582109744911, + 0.4297459873782855, + 0.5080375764949785, + 0.6425579549719145, + 0.33574688027368216, + 0.3243865312052645, + 0.35862728969092755, + 0.30099443637522266, + 0.3743717918646966, + 0.48747467464580885, + 0.3563680746249608, + 0.2673982567659193, + 0.46676843205718255 + ], + "yaxis": "y" + }, + { + "hovertemplate": "predicted=explicit_hate
d1=%{x}
d2=%{y}", + "legendgroup": "explicit_hate", + "marker": { + "color": "#00cc96", + "opacity": 0.4, + "symbol": "circle" + }, + "mode": "markers", + "name": "explicit_hate", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + -0.8179370028503732, + -0.8207357104560331, + -0.7586899708348946, + -1.0712600366205676, + -0.8169340992722887, + -0.7703339166295464, + -0.876481931875819, + -0.8264632778084697, + -0.8778079345335903, + -0.8808971254704396, + -0.7832173727594955, + -0.8811369515077612, + -0.7646216502873611, + -0.7861380620561693, + -0.8853289589513638, + -0.7809534025438851 + ], + "xaxis": "x", + "y": [ + 0.8179370028503732, + 0.8207357104560331, + 0.7586899708348946, + 1.0712600366205676, + 0.8169340992722887, + 0.7703339166295464, + 0.876481931875819, + 0.8264632778084697, + 0.8778079345335903, + 0.8808971254704396, + 0.7832173727594955, + 0.8811369515077612, + 0.7646216502873611, + 0.7861380620561693, + 0.8853289589513638, + 0.7809534025438851 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "predicted" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "d1" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "d2" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = px.scatter(df2pc, x='d1', y='d2',\n", + " color='predicted',size_max=.01,opacity=0.4)\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 247, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parameter containing:\n", + "tensor([0.2969], dtype=torch.float64, requires_grad=True) Parameter containing:\n", + "tensor([-0.2969], dtype=torch.float64, requires_grad=True)\n" + ] + } + ], + "source": [ + "print(model.linear1.bias,model.linear2.bias)" + ] + }, + { + "cell_type": "code", + "execution_count": 248, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[64, 35, 14],\n", + " [24, 53, 58],\n", + " [ 0, 0, 16]])" + ] + }, + "execution_count": 248, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "multiclass_confusion_matrix(torch.tensor([lindict[y] for y in actual],dtype=torch.int64),torch.tensor([lindict[y] for y in predicted],dtype=torch.int64),3)" + ] + } + ], + "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", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}