机器学习-人与机器生数据的区分模型测试-数据处理1

news2025/7/17 5:43:50

附件为训练数据,总体的流程可以作为参考。

导入依赖

import pandas as pd
import os
import numpy as np
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.ensemble import RandomForestClassifier,VotingClassifier 
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix,roc_curve
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from lightgbm import LGBMClassifier
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler,LabelEncoder
from catboost import CatBoostClassifier
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 分析高频共现特征组合
from mlxtend.frequent_patterns import apriori
from sklearn.metrics import roc_auc_score
import json
# 设置工作目录
os.chdir(r'D:\python code\人工与机器人识别')
# 加载数据集
data = pd.read_csv('bots_vs_users.csv')  # 替换为你的数据集路径

EDA

数据分布

def clean_data(data):
    for col in data.columns:
        print(col)
        if col == 'city':  # 跳过第一列
            continue
        else:    
            data[col] = data[col].replace('Unknown','-1')  # 使用均值填充缺失值
            data[col] = data[col].astype('float64')  # 转换为数值类型
            data[col] = data[col].fillna(data[col].mean())  # 使用均值填充缺失值

    return data
    
data = clean_data(data)

encoder = LabelEncoder()
encoder.fit(data['city'])  # 只在第一个DF上fit
data['city2'] = encoder.transform(data['city'])


# 第一次拆分:训练集(70%) + 临时集(30%), 
data,temp = train_test_split(data, test_size=0.1, random_state=42)


# 输出拆分后的数据集大小
print("训练集大小:", data.shape)
print("验证集大小:", temp.shape)
print(data.head())

这里是数据的相关描述统计

入图片描述

描述统计

# 训练集编码
target_list = ['city', 'target', 'city2']
data_clean = data.drop(target_list, axis=1).copy()

# 基本统计描述
print(data_clean.describe().T)

print("方差:\n", data_clean.var(numeric_only=True))
print("众数:\n", data_clean.mode().T) 
print("偏度:\n", data_clean.skew(numeric_only=True))  # 需确保数据为数值型
print("峰度:\n", data_clean.kurtosis(numeric_only=True))

查看数据的分布情况
在这里插入图片描述


def plot_cont_var_dist(df, feature, target='target'):
    """
    绘制连续变量的正负样本核密度估计图(KDE),并计算并标注 KS(Kolmogorov-Smirnov)统计量。

    参数:
    df (pandas.DataFrame): 包含特征和目标变量的数据集。
    feature (str): 要绘制的连续特征的名称。
    target (str, 可选): 目标变量的名称,默认为 'target'。

    """
    # 设置图形的大小
    plt.figure(figsize=(10,6))
    
    # 提取正样本数据,并处理无穷大值,移除缺失值
    pos_data = df.loc[df[target]==1, feature].replace([np.inf, -np.inf], np.nan).dropna()
    # 提取负样本数据,并处理无穷大值,移除缺失值
    neg_data = df.loc[df[target]==0, feature].replace([np.inf, -np.inf], np.nan).dropna()
    
    # 绘制正样本的核密度估计图
    sns.kdeplot(pos_data, label='Positive', 
                fill=True, alpha=0.5, color='#FF6B6B')
    # 绘制负样本的核密度估计图
    sns.kdeplot(neg_data, label='Negative',
                fill=True, alpha=0.5, color='#4ECDC4')
    
    # 检查正样本或负样本数据是否为空,如果为空则跳过该特征的绘制
    if pos_data.empty or neg_data.empty:
        print(f"Skipped {feature} due to empty data")
        plt.close()
        return
    
    try:
        # 计算 ROC 曲线所需的假正率、真正率和阈值
        # 由于使用连续变量计算 KS 需要离散化处理,这里借助 roc_curve 函数
        fpr, tpr, thresholds = roc_curve(df[target], df[feature])
        # 计算 KS 统计量,即真正率与假正率差值的最大值
        ks_value = max(tpr - fpr)
        # 找到对应 KS 统计量最大值的阈值
        ks_threshold = thresholds[np.argmax(tpr - fpr)]
    except Exception as e:
        # 若计算 KS 统计量时出错,打印错误信息并关闭图形
        print(f"Error calculating KS for {feature}: {str(e)}")
        plt.close()
        return
    
    # 在图中绘制 KS 阈值对应的垂直线
    plt.axvline(ks_threshold, color='#2A363B', linestyle='--', 
                linewidth=1.5, label=f'Cutoff: {ks_threshold:.2f}')
    # 设置图形标题,包含特征名称和 KS 统计量的值
    plt.title(f'{feature}\nKS Statistic = {ks_value:.2f}', fontsize=14)
    # 设置 x 轴标签
    plt.xlabel(feature, fontsize=12)
    # 设置 y 轴标签
    plt.ylabel('Density', fontsize=12)
    # 显示图例,去掉边框
    plt.legend(frameon=False)
    # 自动调整子图参数,使之填充整个图像区域
    plt.tight_layout()
    # 显示图形
    plt.show()
    # 关闭图形,释放内存
    plt.close()

# 改进后的过滤逻辑
def is_valid_numeric(col_data):
    """
    判断传入的列数据是否为有效的数值型特征。

    有效的数值型特征需满足以下条件:
    1. 数据类型为数值类型。
    2. 唯一值的数量超过 20 个。
    3. 数据类型不是分类类型。

    参数:
    col_data (pandas.Series): 需要进行判断的列数据。

    返回:
    bool: 如果满足所有条件则返回 True,否则返回 False。
    """
    return (
        # 检查数据类型是否为数值类型
        pd.api.types.is_numeric_dtype(col_data) and 
        # 检查唯一值的数量是否超过 20 个
        col_data.nunique() > 20 and
        # 检查数据类型是否不是分类类型
        not isinstance(col_data.dtype, pd.CategoricalDtype)
    )

filtered_list = [col for col in data.columns 
                if col not in target_list and is_valid_numeric(data[col])]

# 增强型绘图循环
for col in filtered_list:
    try:
        # 预处理inf值
        data[col] = data[col].replace([np.inf, -np.inf], np.nan)
        # 跳过缺失率过高的特征
        if data[col].isnull().mean() > 0.8:
            print(f"Skipped {col} due to high missing rate")
            continue
            
        plot_cont_var_dist(data, col)
    except Exception as e:
        print(f"Plotting failed for {col}: {str(e)}")



#查看数据1的分布情况
one_ratio_list = []
for col in data.columns:
    if col == 'city' or col == 'target' or col == 'city2':  # 跳过第一列
        continue
    else:
        one_ratio = data[col].mean()  # 计算1值占比
        print(f"{col}: {one_ratio}")
        one_ratio_list.append(one_ratio)


plt.figure(figsize=(8,4))
sns.histplot(one_ratio_list, bins=20, kde=True)
plt.title('Histogram of 1-Value Proportion Distribution')
plt.xlabel('Proportion of 1 value')
plt.show()


上述代码会输出相关数据的分布图片,数据很多不一一展示。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HelloWorld

HelloWorld 新建一个java文件 文件后缀名为 .javahello.java【注意】系统可能没有显示文件后缀名,我们需要手动打开 编写代码 public class hello {public static void main(String[] args) {System.out.print(Hello,World)} }编译 javac java文件,会生…

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据

在搜索引擎算法日益复杂的今天,B2C商城想要在海量信息中脱颖而出,仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向,通过URL 重构与结构化数据优化两大核心策略,帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…

数字万用表与指针万用表使用方法及注意事项

在电子测量领域,万用表是极为常用的工具,数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项,能确保测量的准确性与安全性。下面为您详细介绍: 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […

【读代码】端到端多模态语言模型Ultravox深度解析

一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…

RabbitMQ工作流程及使用方法

一、什么是RabbitMQ RabbitMQ 是一款基于 ‌AMQP(高级,消息队列协议)‌ 的开源消息中间件,专为分布式系统设计,用于实现应用程序间的异步通信,其核心功能是通过 ‌消息代理(Message Broker&…

算法:分治法

实验内容 在一个2kⅹ2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为一特殊棋盘。 显然,特殊方格出现的位置有4k 种情况,即k>0,有4k 种不同的特殊棋盘 棋盘覆盖&#xff1a…

MySQL初阶:sql事务和索引

索引(index) 可以类似理解为一本书的目录,一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过: 1.先遍历表 2.将条件带入每行记录中进行判断,看是否符合 3.不符合就跳过 但当表中的…

docker部署第一个Go项目

1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …

Visual Studio2022跨平台Avalonia开发搭建

由于我已经下载并安装了 VS2022版本,这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 ‌“.NET 桌面开发”‌ 和“Visual Studio扩展开发”‌ ,这里由于不是用的微软的MAUI,所以不用选择其他的来支持跨平台开发&a…

css iconfont图标样式修改,js 点击后更改样式

背景: 在vue项目中,通过点击/鼠标覆盖,更改选中元素的样式,可以通过js逻辑,也可以根据css样式修改。包括以下内容:iconfont图标的引入以及使用,iconfont图标样式修改【导入文件是纯白&#xff0…

开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-memory_attention.pyblocks.py: 定义模…

【沉浸式求职学习day42】【算法题:滑动窗口】

沉浸式求职学习 长度最小的子数组水果成篮 关于算法题:滑动窗口的几个题目 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组…

LIIGO ❤️ RUST 12 YEARS

LIIGO 💖 RUST 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天,2015年的今天,Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare,Mozilla公司,以…

Linux基础开发工具二(gcc/g++,自动化构建makefile)

3. 编译器gcc/g 3.1 背景知识 1. 预处理(进行宏替换/去注释/条件编译/头文件展开等) 2. 编译(生成汇编) 3. 汇编(生成机器可识别代码) 4. 连接(生成可执行文件或库文件) 3.2 gcc编译选项 格式 : gcc …

全局异常处理:如何优雅地统一管理业务异常

在软件开发中,异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性,还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…

动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

一、题目解析 frame二维矩阵中每个值代表珠宝的价值,现在从左上角开始拿珠宝,只能向右或向下拿珠宝,到达右下角时停止拿珠宝,要求拿的珠宝价值最大。 二、算法解析 1.状态表示 我们想要知道的是到达[i,j]为位置时的最大价值&am…

JDBC实现模糊、动态与分页查询的详解

文章目录 一. 模糊查询1. Mysql的写法2. JDBC的实现 二. 动态条件查询1. 创建生成动态条件查询sql的方法2. 完整的动态条件查询类以及测试类 三. 分页查询1. 什么是分页查询?2. 分页查询的分类3. MySQL的实现4. JDBC实现4.1. 创建page页4.2. 分页的实现 本章来讲一下…

域环境信息收集技术详解:从基础命令到实战应用

引言 在企业网络环境中,Active Directory (AD)域服务是微软提供的集中式目录服务,用于管理网络中的用户、计算机和其他资源。对于信息安全专业人员来说,熟练掌握域环境信息收集技术至关重要,无论是进行渗透测试、安全评估还是日常…

【C++ Qt】布局管理器

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 🤔绪论​: 在Qt开发中,界面布局的合理设计是提升用户体验的关键。早期,开发者常采用绝对定位的方式摆放控件,即通…

vscode用python开发maya联动调试设置

如何在VScode里编写Maya Python脚本_哔哩哔哩_bilibili1 包括1,maya的python全面在vscode支持,2,通过mayacode发送到maya,3同步调试 import maya.cmds as cmds 1、让 maya.cmds编译通过 下载Autodesk_Maya_2018_6_Update_DEVK…