{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":4117,"databundleVersionId":46665,"sourceType":"competition"},{"sourceId":3161014,"sourceType":"datasetVersion","datasetId":1917019}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"* * 此代码是为那些想要分析恶意代码数据，但由于数据容量过大而无法进行分析的人设计的。**\nSomething\n* * 由于容量限制，只使用了字节文件，并且在公共领导委员会核心只使用了字节文件实现了0.02742。**\nSomething\n我们创建了一个只有字节文件的数据集，这样就可以不受容量限制地跟踪它\nSomething\n在尝试了几种方法之后，评估模型的过程去除了许多重叠的部分，只留下了良好的性能\nSomething\n如果你没有容量限制，你可以更好地利用数据","metadata":{}},{"cell_type":"markdown","source":"\n# **基于字节特征的集成学习恶意软件检测模型**\n","metadata":{}},{"cell_type":"markdown","source":"<p style = \"font-size:18px\"><b> .bytes file</b></p>\n<pre>\n00401000 00 00 80 40 40 28 00 1C 02 42 00 C4 00 20 04 20\n00401010 00 00 20 09 2A 02 00 00 00 00 8E 10 41 0A 21 01\n00401020 40 00 02 01 00 90 21 00 32 40 00 1C 01 40 C8 18\n00401030 40 82 02 63 20 00 00 09 10 01 02 21 00 82 00 04\n00401040 82 20 08 83 00 08 00 00 00 00 02 00 60 80 10 80\n00401050 18 00 00 20 A9 00 00 00 00 04 04 78 01 02 70 90\n00401060 00 02 00 08 20 12 00 00 00 40 10 00 80 00 40 19\n00401070 00 00 00 00 11 20 80 04 80 10 00 20 00 00 25 00\n00401080 00 00 01 00 00 04 00 10 02 C1 80 80 00 20 20 00\n00401090 08 A0 01 01 44 28 00 00 08 10 20 00 02 08 00 00\n004010A0 00 40 00 00 00 34 40 40 00 04 00 08 80 08 00 08\n004010B0 10 00 40 00 68 02 40 04 E1 00 28 14 00 08 20 0A\n004010C0 06 01 02 00 40 00 00 00 00 00 00 20 00 02 00 04\n004010D0 80 18 90 00 00 10 A0 00 45 09 00 10 04 40 44 82\n004010E0 90 00 26 10 00 00 04 00 82 00 00 00 20 40 00 00\n004010F0 B4 00 00 40 00 02 20 25 08 00 00 00 00 00 00 00\n00401100 08 00 00 50 00 08 40 50 00 02 06 22 08 85 30 00\n00401110 00 80 00 80 60 00 09 00 04 20 00 00 00 00 00 00\n00401120 00 82 40 02 00 11 46 01 4A 01 8C 01 E6 00 86 10\n00401130 4C 01 22 00 64 00 AE 01 EA 01 2A 11 E8 10 26 11\n00401140 4E 11 8E 11 C2 00 6C 00 0C 11 60 01 CA 00 62 10\n00401150 6C 01 A0 11 CE 10 2C 11 4E 10 8C 00 CE 01 AE 01\n00401160 6C 10 6C 11 A2 01 AE 00 46 11 EE 10 22 00 A8 00\n00401170 EC 01 08 11 A2 01 AE 10 6C 00 6E 00 AC 11 8C 00\n00401180 EC 01 2A 10 2A 01 AE 00 40 00 C8 10 48 01 4E 11\n00401190 0E 00 EC 11 24 10 4A 10 04 01 C8 11 E6 01 C2 00\n\n</pre>","metadata":{"jupyter":{"source_hidden":true}}},{"cell_type":"code","source":"import pandas as pd\nimport seaborn as sns\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# 加载 CSV 文件到一个 DataFrame 中\nY = pd.read_csv(\"../input/malware-classification/trainLabels.csv\")\n\n# 计算总样本数\ntotal = len(Y) * 1.0\n\n# 创建一个类别分布的计数图\nax = sns.countplot(x=\"Class\", data=Y)\n\n# 在柱状图上添加百分比标注\nfor p in ax.patches:\n    ax.annotate('{:.1f}%'.format(100 * p.get_height() / total), (p.get_x() + 0.1, p.get_height() + 5))\n\n# 设置 11 个 y 轴刻度，均匀分布在 0 到总样本数之间\nax.yaxis.set_ticks(np.linspace(0, total, 11))\n\n# 将刻度标签格式化为百分比\nax.set_yticklabels(map('{:.1f}%'.format, 100 * ax.yaxis.get_majorticklocs() / total))\n\n# 显示绘图\nplt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Import**","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"**use pandas, numpy**\n\n**We use tqdm to know the progress.**\n\n**os for reading files and warnings for ignoring warnings,**\n\n**Stratified kfold for producing stacking data using cv,**\n\n**In addition, we imported boosting models that are showing good performance in kaggle these days.**\n","metadata":{}},{"cell_type":"code","source":"# 导入必要的库\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\nimport os\nimport warnings\n\n# 忽略警告\nwarnings.filterwarnings(\"ignore\")\n\n# 导入交叉验证方法\nfrom sklearn.model_selection import StratifiedKFold\n\n# 创建 StratifiedKFold 对象，将数据集分成 5 折，并设置随机种子\nfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=62)\n\n# 导入 LightGBM、XGBoost 和 CatBoost 分类器\nfrom lightgbm import LGBMClassifier\nfrom xgboost import XGBClassifier\nfrom catboost import CatBoostClassifier\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **(data load)**","metadata":{}},{"cell_type":"markdown","source":"\n\n**Read the sample submission in the form of train labels and submission where the class of the file is written.**","metadata":{}},{"cell_type":"code","source":"train_labels=pd.read_csv(\"../input/malware-classification/trainLabels.csv\")\nsample = pd.read_csv(\"../input/malware-classification/sampleSubmission.csv\",index_col=\"Id\")\na = '\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"0a\",\"0b\",\"0c\",\"0d\",\"0e\",\"0f\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"1a\",\"1b\",\"1c\",\"1d\",\"1e\",\"1f\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"2a\",\"2b\",\"2c\",\"2d\",\"2e\",\"2f\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"3a\",\"3b\",\"3c\",\"3d\",\"3e\",\"3f\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"4a\",\"4b\",\"4c\",\"4d\",\"4e\",\"4f\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"5a\",\"5b\",\"5c\",\"5d\",\"5e\",\"5f\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"6a\",\"6b\",\"6c\",\"6d\",\"6e\",\"6f\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"7a\",\"7b\",\"7c\",\"7d\",\"7e\",\"7f\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"8a\",\"8b\",\"8c\",\"8d\",\"8e\",\"8f\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"9a\",\"9b\",\"9c\",\"9d\",\"9e\",\"9f\",\"a0\",\"a1\",\"a2\",\"a3\",\"a4\",\"a5\",\"a6\",\"a7\",\"a8\",\"a9\",\"aa\",\"ab\",\"ac\",\"ad\",\"ae\",\"af\",\"b0\",\"b1\",\"b2\",\"b3\",\"b4\",\"b5\",\"b6\",\"b7\",\"b8\",\"b9\",\"ba\",\"bb\",\"bc\",\"bd\",\"be\",\"bf\",\"c0\",\"c1\",\"c2\",\"c3\",\"c4\",\"c5\",\"c6\",\"c7\",\"c8\",\"c9\",\"ca\",\"cb\",\"cc\",\"cd\",\"ce\",\"cf\",\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\",\"d6\",\"d7\",\"d8\",\"d9\",\"da\",\"db\",\"dc\",\"dd\",\"de\",\"df\",\"e0\",\"e1\",\"e2\",\"e3\",\"e4\",\"e5\",\"e6\",\"e7\",\"e8\",\"e9\",\"ea\",\"eb\",\"ec\",\"ed\",\"ee\",\"ef\",\"f0\",\"f1\",\"f2\",\"f3\",\"f4\",\"f5\",\"f6\",\"f7\",\"f8\",\"f9\",\"fa\",\"fb\",\"fc\",\"fd\",\"fe\",\"ff\",\"??\",\"size\",\"Class\"'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **(preprocessing)**","metadata":{}},{"cell_type":"markdown","source":"```python\nimport numpy as np\nimport os\nfrom tqdm import tqdm\nimport pandas as pd\n\n# 创建一个零矩阵，形状为 (文件数量, 特征数量)\ntrain_np = np.zeros((len(files), len(a.split(\",\"))))\n\n# 获取文件夹中的文件列表，并按文件名排序\nfiles = os.listdir(\"../input/malware-only-byte/only_byte\")\nfiles.sort()\n\nk = 0\n# 遍历文件列表\nfor file in tqdm(files):\n    # 获取文件的统计信息，例如文件大小\n    statinfo = os.stat(\"../input/malware-only-byte/only_byte/\" + file)\n\n    # 打开文件进行逐行处理\n    with open(\"../input/malware-only-byte/only_byte/\" + file, \"r\") as fp:\n        for lines in fp.readlines():\n            line = lines.rstrip().split(\" \")[1:]\n            for hex_code in line:\n                if hex_code == '??':\n                    train_np[k][256] += 1\n                else:\n                    train_np[k][int(hex_code, 16)] += 1\n\n        # 将文件大小和类别信息添加到特征矩阵\n        train_np[k][257] = statinfo.st_size / (1024 * 1024)\n        train_np[k][258] = train_labels[train_labels[\"Id\"] == file.split('.')[0]][\"Class\"].tolist()[0]\n\n    fp.close()\n    k += 1\n\n# 创建一个 DataFrame，并将特征矩阵的内容保存到 CSV 文件\ntrain = pd.DataFrame(train_np, columns=a[1:-1].split('\",\"'))\ntrain.to_csv(\"train_data.csv\", index=False)\n\n# 打印 DataFrame 的前几行\ntrain.head()\n\n\n```","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"**The code above is a code that reads the file using the file name and represents the number of hex values such as 0, 1, 2, ..., ?? in each file.**\n\n**I referred to https://www.kaggle.com/paulrohan2020/microsoft-malware-detection-log-loss-of-0-0070**\n\n**I wrote down markdown because of the long execution time. You can copy and execute the code above.**\n\n\n处理数据的代码运行时间太长了，所以提供了已经处理成功的样本文件","metadata":{}},{"cell_type":"code","source":"train=pd.read_csv(\"../input/malware-only-byte/train_data.csv\")\n\n\n#FileSize_MB: 这一列包含了文件的大小（以兆字节为单位）。它是从文件统计信息中提取的，用于作为特征之一。\n\n#Class: 这一列包含了文件的类别。它是从训练标签数据中提取的，用于作为目标变量或标签。","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"```python\nimport numpy as np\nimport os\nfrom tqdm import tqdm\nimport pandas as pd\n\n# 创建一个空列表来存储测试文件名（不带扩展名）\nfile2 = []\n\n# 遍历测试文件列表，提取文件名并存储到 file2 列表\nfor file in files:\n    file2.append(file.split(\".\")[0])\n\n# 创建一个零矩阵，形状为 (文件数量, 特征数量)\ntest_np = np.zeros((len(files), len(a.split(\",\"))))\n\n# 获取测试数据文件夹中的文件列表，并按文件名排序\nfiles = os.listdir(\"../input/malware-only-byte/test\")\nfiles.sort()\n\nk = 0\n# 遍历测试文件列表\nfor file in tqdm(files):\n    # 获取文件的统计信息，例如文件大小\n    statinfo = os.stat(\"../input/malware-only-byte/test/\" + file)\n\n    # 打开文件进行逐行处理\n    with open(\"../input/malware-only-byte/test/\" + file, \"r\") as fp:\n        for lines in fp.readlines():\n            line = lines.rstrip().split(\" \")[1:]\n            for hex_code in line:\n                if hex_code == '??':\n                    # 如果是占位符 '??'，在特征矩阵的最后一列累加计数\n                    test_np[k][256] += 1\n                else:\n                    # 将十六进制代码转换为整数，并在特征矩阵中对应位置累加计数\n                    test_np[k][int(hex_code, 16)] += 1\n\n        # 将文件大小添加到特征矩阵的最后一列\n        test_np[k][257] = statinfo.st_size / (1024 * 1024)\n\n    fp.close()\n    k += 1\n\n# 创建一个 DataFrame，并将特征矩阵的内容保存到 CSV 文件\ntest = pd.DataFrame(test_np, columns=a[1:-1].split('\",\"'))\n\n# 将测试文件名添加为一列，列名为 \"Id\"\ntest[\"Id\"] = file2\n\n# 将DataFrame保存为CSV文件，不包括行索引\ntest.to_csv(\"test_data.csv\", index=False)\n\n# 打印 DataFrame 的前几行，以确认数据处理和保存正确\ntest.head()\n\n```","metadata":{}},{"cell_type":"markdown","source":"测试的数据集如下\n\n**The code above is the code conducted for the test byte file.**","metadata":{}},{"cell_type":"code","source":"test=pd.read_csv(\"../input/malware-only-byte/test_data.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **(modeling and stacking)**","metadata":{}},{"cell_type":"code","source":"# 从名为\"train\"的DataFrame中去除\"Class\"列，并将结果存储在\"X\"中\nX = train.drop(['Class'], axis=1)\n\n# 将\"Class\"列的值存储在\"y\"中\ny = train['Class']\n\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n\n**Divide the values excluding the predicted values by X and y.**","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"**After that, cross validation is performed on the train data for stacking to create a predicted value of the train data set as a predicted value for each validation set.**\n\n**You can learn X and y right away and make predictions, but the one who did the stacking performed better.**\n\n\n接着，对训练数据进行交叉验证，以便进行堆叠（stacking），从而为每个验证集创建训练数据集的预测值。\n\n你可以立即使用X和y进行预测，但是进行了堆叠的人表现更好。","metadata":{}},{"cell_type":"code","source":"\n# 从CSV文件读取训练数据\nstack_df = pd.read_csv(\"../input/malware-only-byte/train_data.csv\")\n\n# 创建StratifiedKFold实例，用于交叉验证\nfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n\n# 遍历每个交叉验证折叠\nfor i, j in enumerate(fold.split(X, y)):\n    # 提取当前折叠的训练和验证数据\n    stack_train_X = X.iloc[j[0]]\n    stack_train_y = y.iloc[j[0]]\n    stack_test_X = X.iloc[j[1]]\n    stack_test_y = y.iloc[j[1]]\n    \n    # 创建并训练一个LightGBM分类器\n    model = LGBMClassifier(learning_rate=0.025, n_estimators=850, min_child_weight=1, boosting_type=\"gbdt\", min_child_samples=68, random_state=62, objective=\"multi-class\", metric=\"multi_logloss\")\n    model.fit(stack_train_X, stack_train_y)\n    \n    # 对验证数据进行预测\n    preds = model.predict_proba(stack_test_X)\n    preds = pd.DataFrame(preds)\n    \n    # 更新预测结果到stack_df的相应位置\n    stack_df[\"0\"].iloc[j[1]] = preds[0]\n    stack_df[\"1\"].iloc[j[1]] = preds[1]\n    stack_df[\"2\"].iloc[j[1]] = preds[2]\n    stack_df[\"3\"].iloc[j[1]] = preds[3]\n    stack_df[\"4\"].iloc[j[1]] = preds[4]\n    stack_df[\"5\"].iloc[j[1]] = preds[5]\n    stack_df[\"6\"].iloc[j[1]] = preds[6]\n    stack_df[\"7\"].iloc[j[1]] = preds[7]\n    stack_df[\"8\"].iloc[j[1]] = preds[8]\n\n# 从stack_df中提取LightGBM模型的预测结果\nlgbm_stack = stack_df[[\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\"]]\n\n# 重命名列名以表示预测的类别\nlgbm_stack.columns = [\"lgbm_Prediction1\", \"lgbm_Prediction2\", \"lgbm_Prediction3\", \"lgbm_Prediction4\", \"lgbm_Prediction5\", \"lgbm_Prediction6\", \"lgbm_Prediction7\", \"lgbm_Prediction8\", \"lgbm_Prediction9\"]\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# 从CSV文件读取训练数据\nstack_df = pd.read_csv(\"../input/malware-only-byte/train_data.csv\")\n\n# 创建StratifiedKFold实例，用于交叉验证\nfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n\ny2=y-1\n# 遍历每个交叉验证折叠\nfor i, j in enumerate(fold.split(X, y2)):\n    # 提取当前折叠的训练和验证数据\n    stack_train_X = X.iloc[j[0]]\n    stack_train_y = y2.iloc[j[0]]\n    stack_test_X = X.iloc[j[1]]\n    stack_test_y = y2.iloc[j[1]]\n    \n    # 创建并训练一个XGBoost分类器\n    model = XGBClassifier(booster=\"gbtree\", eta=0.0975, min_child_weight=2, random_state=62, objective=\"multi:softmax\", eval_metric=\"logloss\")\n    model.fit(stack_train_X, stack_train_y)\n    \n    # 对验证数据进行预测\n    preds = model.predict_proba(stack_test_X)\n    preds = pd.DataFrame(preds)\n    \n    # 更新预测结果到stack_df的相应位置\n    stack_df[\"0\"].iloc[j[1]] = preds[0]\n    stack_df[\"1\"].iloc[j[1]] = preds[1]\n    stack_df[\"2\"].iloc[j[1]] = preds[2]\n    stack_df[\"3\"].iloc[j[1]] = preds[3]\n    stack_df[\"4\"].iloc[j[1]] = preds[4]\n    stack_df[\"5\"].iloc[j[1]] = preds[5]\n    stack_df[\"6\"].iloc[j[1]] = preds[6]\n    stack_df[\"7\"].iloc[j[1]] = preds[7]\n    stack_df[\"8\"].iloc[j[1]] = preds[8]\n\n# 从stack_df中提取XGBoost模型的预测结果\nxgb_stack = stack_df[[\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\"]]\n\n# 重命名列名以表示预测的类别\nxgb_stack.columns = [\"xgb_Prediction1\", \"xgb_Prediction2\", \"xgb_Prediction3\", \"xgb_Prediction4\", \"xgb_Prediction5\", \"xgb_Prediction6\", \"xgb_Prediction7\", \"xgb_Prediction8\", \"xgb_Prediction9\"]\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# 从CSV文件读取训练数据\nstack_df = pd.read_csv(\"../input/malware-only-byte/train_data.csv\")\n\n# 创建StratifiedKFold实例，用于交叉验证\nfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)\n\n# 遍历每个交叉验证折叠\nfor i, j in enumerate(fold.split(X, y)):\n    # 提取当前折叠的训练和验证数据\n    stack_train_X = X.iloc[j[0]]\n    stack_train_y = y.iloc[j[0]]\n    stack_test_X = X.iloc[j[1]]\n    stack_test_y = y.iloc[j[1]]\n    \n    # 创建并训练一个CatBoost分类器\n    model = CatBoostClassifier(verbose=0)\n    model.fit(stack_train_X, stack_train_y)\n    \n    # 对验证数据进行预测\n    preds = model.predict_proba(stack_test_X)\n    preds = pd.DataFrame(preds)\n    \n    # 更新预测结果到stack_df的相应位置\n    stack_df[\"0\"].iloc[j[1]] = preds[0]\n    stack_df[\"1\"].iloc[j[1]] = preds[1]\n    stack_df[\"2\"].iloc[j[1]] = preds[2]\n    stack_df[\"3\"].iloc[j[1]] = preds[3]\n    stack_df[\"4\"].iloc[j[1]] = preds[4]\n    stack_df[\"5\"].iloc[j[1]] = preds[5]\n    stack_df[\"6\"].iloc[j[1]] = preds[6]\n    stack_df[\"7\"].iloc[j[1]] = preds[7]\n    stack_df[\"8\"].iloc[j[1]] = preds[8]\n\n# 从stack_df中提取CatBoost模型的预测结果\ncat_stack = stack_df[[\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\"]]\n\n# 重命名列名以表示预测的类别\ncat_stack.columns = [\"cat_Prediction1\", \"cat_Prediction2\", \"cat_Prediction3\", \"cat_Prediction4\", \"cat_Prediction5\", \"cat_Prediction6\", \"cat_Prediction7\", \"cat_Prediction8\", \"cat_Prediction9\"]\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 将三个预测结果的DataFrame在水平方向合并\nstacking_X = pd.concat([xgb_stack, lgbm_stack, cat_stack], axis=1)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install imbalanced-learn","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nfrom imblearn.over_sampling import SMOTE\nfrom imblearn.under_sampling import RandomUnderSampler\nimport pandas as pd\n\n\nsmote = SMOTE(sampling_strategy='auto')\nunder_sampler = RandomUnderSampler(sampling_strategy='auto')\n\n# 使用过采样和欠采样处理训练数据\nX_resampled, y_resampled = smote.fit_resample(X, y)\nX_resampled, y_resampled = under_sampler.fit_resample(X_resampled, y_resampled)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_resampled, y_resampled","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n\n**Stacking was performed on the train set using each model, and the predicted value was made into new learning data.**","metadata":{}},{"cell_type":"code","source":"\n\n# 创建一个LightGBM分类器，配置参数\nmodel = LGBMClassifier(learning_rate=0.025, n_estimators=850, min_child_weight=1, boosting_type=\"gbdt\", min_child_samples=68, random_state=62, objective=\"multi-class\", metric=\"multi_logloss\")\n\n# 使用训练数据（X为特征，y为标签）对模型进行训练\nmodel.fit(X_resampled, y_resampled)\n\n# 对测试数据进行预测，并返回预测概率\nlgbm_pred = model.predict_proba(test.drop(\"Id\", axis=1))\n\n# 创建一个DataFrame来存储预测结果\nlgbm_pred = pd.DataFrame(lgbm_pred)\n\n# 为预测结果的列添加适当的名称，以表示每个类别的预测概率\nlgbm_pred.columns = [\"lgbm_Prediction1\", \"lgbm_Prediction2\", \"lgbm_Prediction3\", \"lgbm_Prediction4\", \"lgbm_Prediction5\", \"lgbm_Prediction6\", \"lgbm_Prediction7\", \"lgbm_Prediction8\", \"lgbm_Prediction9\"]\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# 创建一个XGBoost分类器，配置参数\nmodel = XGBClassifier(booster=\"gbtree\", eta=0.0975, min_child_weight=2, random_state=62, objective=\"multi:softmax\", eval_metric=\"logloss\")\n\n# 使用训练数据（X为特征，y为标签）对模型进行训练\n# y2=y-1\n\n# model.fit(X, y2)\ny_resampled2=y_resampled-1\nmodel.fit(X_resampled, y_resampled2)\n\n# 对测试数据进行预测，并返回预测概率\nxgb_pred = model.predict_proba(test.drop(\"Id\", axis=1))\n\n# 创建一个DataFrame来存储预测结果\nxgb_pred = pd.DataFrame(xgb_pred)\n\n# 为预测结果的列添加适当的名称，以表示每个类别的预测概率\nxgb_pred.columns = [\"xgb_Prediction1\", \"xgb_Prediction2\", \"xgb_Prediction3\", \"xgb_Prediction4\", \"xgb_Prediction5\", \"xgb_Prediction6\", \"xgb_Prediction7\", \"xgb_Prediction8\", \"xgb_Prediction9\"]\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # 绘制条形图\n# import matplotlib.pyplot as plt\n# import seaborn as sns\n\n# plt.figure(figsize=(10, 6))\n# sns.barplot(data=xgb_pred, ci=None)\n# plt.title(\"XGBoost Classifier Prediction Probabilities\")\n# plt.ylabel(\"Prediction Probability\")\n# plt.xlabel(\"Category\")\n# plt.xticks(rotation=45)\n# plt.show()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\n# 创建一个CatBoost分类器，配置参数，verbose=0表示不输出训练过程信息\nmodel = CatBoostClassifier(verbose=0)\n\n# 使用训练数据（X为特征，y为标签）对模型进行训练\nmodel.fit(X_resampled, y_resampled)\n\n# 对测试数据进行预测，并返回预测概率\ncat_pred = model.predict_proba(test.drop(\"Id\", axis=1))\n\n# 创建一个DataFrame来存储预测结果\ncat_pred = pd.DataFrame(cat_pred)\n\n# 为预测结果的列添加适当的名称，以表示每个类别的预测概率\ncat_pred.columns = [\"cat_Prediction1\", \"cat_Prediction2\", \"cat_Prediction3\", \"cat_Prediction4\", \"cat_Prediction5\", \"cat_Prediction6\", \"cat_Prediction7\", \"cat_Prediction8\", \"cat_Prediction9\"]\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cat_pred","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 将三个预测结果的DataFrame在水平方向合并\ntest_X = pd.concat([xgb_pred, lgbm_pred, cat_pred], axis=1)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_X\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"\n\n**A predicted value for test data was generated.**\n生成了测试数据的预测值","metadata":{}},{"cell_type":"code","source":"\n\n# 创建一个CatBoost分类器，配置参数，verbose=0表示不输出训练过程信息\nmodel = CatBoostClassifier(verbose=0)\n\n# 使用堆叠后的特征数据（stacking_X为之前合并的特征数据，y为训练标签）对模型进行训练\nmodel.fit(stacking_X, y)\n\n# 对测试数据进行预测，并返回预测概率\npred = model.predict_proba(test_X)\n\n# 创建一个DataFrame来存储预测结果\nimsi_df = pd.DataFrame(pred)\nimsi_df = imsi_df.set_index(test[\"Id\"])\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimport pandas as pd\n# 从样本文件中读取数据，并将预测结果合并\nsample = pd.read_csv(\"../input/malware-classification/sampleSubmission.csv\",index_col=\"Id\")\n\n#  提取ID\nsample22 = pd.read_csv(\"../input/malware-classification/sampleSubmission.csv\")\n\nsample_ID=sample22.iloc[:, 0]\n\nsample_ID\n\n\n\nsubmission = pd.concat([sample, imsi_df], axis=1)\n\nsubmission\n\n# 删除不需要的列，并重命名列名\nsubmission = submission.drop([\"Prediction1\", \"Prediction2\", \"Prediction3\", \"Prediction4\", \"Prediction5\", \"Prediction6\", \"Prediction7\", \"Prediction8\", \"Prediction9\"], axis=1)\nsubmission.columns = [\"Prediction1\", \"Prediction2\", \"Prediction3\", \"Prediction4\", \"Prediction5\", \"Prediction6\", \"Prediction7\", \"Prediction8\", \"Prediction9\"]\n\n\n \nsubmission\n\n# 将结果保存为CSV文件\nsubmission.to_csv(\"submission.csv\")\n\n\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}