数据挖掘多模块接口(二分类)python旗舰版

news2024/12/26 3:51:21

数据挖掘任务一般分为四大步骤:

  • 1、数据预处理

  • 2、特征选择

  • 3、模型训练与测试

  • 4、模型评估

本文为四大步骤提供接口,使得能够快速进行一个数据挖掘多种任务中,常见的二分类任务。

0. 导包

0.1 忽略警告信息:

import warnings
warnings.filterwarnings("ignore")

0.2 导入一些常用的包:

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd
import seaborn as sns
%matplotlib inline

pd.set_option('display.max_columns', 50)  # or 1000

import matplotlib.ticker as mtick
import matplotlib.patches as mpatches

from imblearn.metrics import classification_report_imbalanced
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import make_pipeline as imbalanced_make_pipeline, Pipeline
from imblearn.under_sampling import NearMiss

from sklearn.decomposition import PCA, TruncatedSVD
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.manifold import TSNE
from sklearn.metrics import (accuracy_score, classification_report, f1_score,
                             precision_recall_curve, precision_score,
                             recall_score, roc_auc_score, roc_curve, RocCurveDisplay)
from sklearn.model_selection import (GridSearchCV, KFold, RandomizedSearchCV,
                                     ShuffleSplit, StratifiedKFold,
                                     StratifiedShuffleSplit, cross_val_predict,
                                     cross_val_score, learning_curve,
                                     train_test_split)
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import RobustScaler, StandardScaler,OneHotEncoder, MinMaxScaler
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

from xgboost import XGBClassifier

import plotly.express as px 

0.3 查看当前工作路径文件:

import os
wd = os.getcwd()
print(os.listdir(wd))
  1. 数据预处理

1.1 加载数据集

csv_filePath = 'sample.csv'
df = read_csv(csv_filePath)
data_length = len(df)
df.head(5)

1.2 查看数据集信息

df.info() # information

1.3.1 查看缺失值

null_frame = df.isnull().sum().to_frame().T
null_frame

1.3.2 处理缺失值

# According to the above information, you can freely choose which column to operate on
# Option 1: Attributes that need to fill in missing values
fillna_columns = []
# Option 2: The row with missing values in the specified column needs to be deleted.
dropna_columns = []
# Option 3: delete the column name of the entire column.
dropaxis_columns = []
# run options
for dim in df.isnull().sum().to_frame().T:
        # NOTE: The value used to fill in missing values can be found in the above [XXX_df.description()].
        if dim in fillna_columns:
            df[dim].fillna(value=df[dim].mean(), inplace=True)
        # NOTE: Delete rows with missing values
        if dim in dropna_columns:
            df.dropna(subset=[dim], inplace=True)
        # Delete an entire column
        if dim in dropaxis_columns:
            df.drop([dim], axis=1, inplace=True)

1.3.3 再次查看缺失值

df.isnull().sum().to_frame().T

1.4 把总数据集划分为特征数据集和目标数据集(只保留特征属性与目标属性相关性大于0.05的特征属性)

y_label = 'result'
features = df.corr().columns[df.corr()[y_label].abs()> .05]
X = X[df.drop(y_label,axis=1).columns]
y = df[y_label]

1.5.1 让所有objcet类型变为float类型(字符串转数值类型)

from collections import defaultdict
one_hot_dims = []
for dim in df:
    if type(df[dim].tolist()[0])==str :
        one_hot_dims.append(dim)
        labels = list(df[dim])
        uni_labels = set(df[dim])
        OrdinalEncoder = defaultdict(list)
        for idx, label in enumerate(uni_labels):
            OrdinalEncoder[dim].append([label, idx])
        for k in OrdinalEncoder:
            values = OrdinalEncoder[k]
            oe = {}
            for v in values:
                oe[k] = {v[0]:v[1]}
                df = df.replace(oe)
df.head()

1.5.2 让所有objcet类型变为one-hot独热编码(字符串转独热编码类型)

def one_hot_and_merge_objectDim(df, object_type_dims):
    #Only process object type data
    for key in object_type_dims:
        if type(df[key].tolist()[0])!=str:
            continue
        if key not in df.columns:
            continue
        print(key + ' is done.')
        # Step1、get new dim(DataFrame)
        new_dim = pd.get_dummies(df[key])
        # Step2、rename new dim 
        new_columns = list(new_dim.columns)
        rename_columns = {}
        for col in new_columns:
            rename_columns[col] = str(key) + '_' + str(col)
        new_dim.rename(columns=rename_columns, inplace=True)
        # Step3、merge new dim to DataSet and drop the old dim
        df = df.drop(columns=key)
        for dim in new_dim:
            df[dim] = new_dim[dim].tolist()
    return df
# 一般只对X特征属性进行one_hot处理, 具体的操作具体情况来定
X = one_hot_and_merge_objectDim(X, one_hot_dims)
X.info()

1.7 查看数据分布信息

df.describe()

1.8 查看目标属性数据分布是否均衡

schem = {}
for x in list(y.unique()):
    schem[x] = list(y).count(x)
plt.bar(schem.keys(),schem.values())
plt.show()

2. 特征选择

2.1 协方差特征选择图

fig, ax = plt.subplots(figsize=(30, 20))
corr = df.corr()
cmap = sns.diverging_palette(220, 10, as_cmap=True)
mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.heatmap(corr, annot = True, linewidth=.8, cmap=cmap, mask=mask)

2.2.1 随机森林特征选择图

from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.pipeline import Pipeline

rf = RandomForestRegressor(n_estimators=100,max_depth=None)
rf_pipe = Pipeline([('standardize', StandardScaler()), ('rf', rf)])
rf_pipe.fit(X, y)
 
#根据随机森林模型的拟合结果选择特征
rf = rf_pipe.__getitem__('rf')
importance = rf.feature_importances_
 
#np.argsort()返回待排序集合从下到大的索引值,[::-1]实现倒序,即最终imp_result内保存的是从大到小的索引值
imp_result = np.argsort(importance)[::-1][:10]
 
#按重要性从高到低输出属性列名和其重要性
for i in range(len(imp_result)):
    print("%2d. %-*s %f" % (i + 1, 30, feat_labels[imp_result[i]], importance[imp_result[i]]))
 
#对属性列,按属性重要性从高到低进行排序
feat_labels = [feat_labels[i] for i in imp_result]
#绘制特征重要性图像
plt.title('Feature Importance')
plt.bar(range(len(imp_result)), importance[imp_result], color='lightblue', align='center')
plt.xticks(range(len(imp_result)), feat_labels, rotation=90)
plt.xlim([-1, len(imp_result)])
plt.tight_layout()
plt.show()

2.2.2 根据随机森林特征重要性保留前k位特征属性

# 根据上图选择要保留几个特征(从最重要开始)
save_featLength = len(feat_labels)
X = X[feat_labels[:save_featLength]]
X

3. 模型训练与测试

3.1 划分数据集并预留计算残差函数

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state=1)

model_names = ['LR', 'DTC', 'RF', 'XGB']
accs = []
reds = []
def get_residuals(y_truth, y_pred):
    cc=(y_truth-y_pred)
    ccp=cc**2
    loss=sum(ccp)
    return cc,ccp,loss

3.2 逻辑回归模型分类

logr = LogisticRegression()
logr.fit(X_train, y_train)
logr_pred = logr.predict(X_test)
logr_proba = logr.predict_proba(X_test)
print("LogisticRegression:")
print("训练集分数:{:.2f}%".format(logr.score(X_train,y_train)*100))
print("验证集分数:{:.2f}%".format(logr.score(X_test,y_test)*100))
print('残差:{}'.format(get_residuals(y_test, logr_pred)[-1]))
accs.append(logr.score(X_test,y_test)*100)
reds.append(get_residuals(y_test, logr_pred)[-1])

3.3 决策树分类

dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)
dt_pred = dt.predict(X_test)
dt_proba = dt.predict_proba(X_test)
print("DecisionTreeClassifier:")
print("训练集分数:{:.2f}%".format(dt.score(X_train,y_train)*100))
print("验证集分数:{:.2f}%".format(dt.score(X_test,y_test)*100))
print('残差:{}'.format(get_residuals(y_test, dt_pred)[-1]))
accs.append(dt.score(X_test,y_test)*100)
reds.append(get_residuals(y_test, dt_pred)[-1])

3.4 随机森林分类

rf = RandomForestClassifier()
rf.fit(X_train, y_train)
rf_pred = rf.predict(X_test)
rf_proba = rf.predict_proba(X_test)
print("RandomForestClassifier:")
print("训练集分数:{:.2f}%".format(rf.score(X_train,y_train)*100))
print("验证集分数:{:.2f}%".format(rf.score(X_test,y_test)*100))
print('残差:{}'.format(get_residuals(y_test, rf_pred)[-1]))
accs.append(rf.score(X_test,y_test)*100)
reds.append(get_residuals(y_test, rf_pred)[-1])

3.5 XGBoost分类

XGB = XGBClassifier()
XGB.fit(X_train, y_train)
XGB_pred = XGB.predict(X_test)
XGB_proba = XGB.predict_proba(X_test)
print("XGBClassifier:")
print("训练集分数:{:.2f}%".format(XGB.score(X_train,y_train)*100))
print("验证集分数:{:.2f}%".format(XGB.score(X_test,y_test)*100))
print('残差:{}'.format(get_residuals(y_test, XGB_pred)[-1]))
accs.append(XGB.score(X_test,y_test)*100)
reds.append(get_residuals(y_test, XGB_pred)[-1])

4. 模型评估

4.1 使用ROC评估曲线

def metrics_scoring_table(y_model,y_true, model_name, y_proba=[0]):
    prec = precision_score(y_true, y_model)
    accu = accuracy_score( y_true, y_model)
    recall = recall_score(y_true, y_model)
    f1 = f1_score(y_true, y_model)
    #roc = roc_auc_score(y_true, y_proba[:, 1])
    df_score = pd.DataFrame(data= {
    "model" :  model_name,
    "accuracy score": accu,
    "precision score": prec,
    "recall score": recall,
    "f1-score": f1,
    #"ROC-AUC": roc
    },
    index = [0]
    )
    return df_score

def roc_curve_plot(Y_pred, Y_true, Y_pred_pobablities, model_name):
    Y_pp = Y_pred_pobablities[:, 1]
    fpr, tpr, threshold1 = roc_curve(Y_true, Y_pp )
    
    fig, ax = plt.subplots(nrows=1, ncols= 1, figsize = (7,5), constrained_layout = True)
    ax.plot(fpr, tpr, label='ROC Score: {:.5f}'.format(roc_auc_score(Y_true, Y_pp)))
    ax.set_title(f"{model_name} ROC Curve ", fontdict = {"fontsize": 18})
    ax.set_xlabel("False Positive Rate", fontdict = {"fontsize": 15} )
    ax.set_ylabel("True Positive Rate", fontdict = {"fontsize": 15})
    ax.legend(loc = 4, fontsize = 14 )

    plt.show()

def roc_summary_plot(Y_true, Y_probability = [], model_name = []):
    for i in range(len(Y_probability)):
        fpr, tpr, threshold1 = roc_curve(Y_true,Y_probability[i][:,1] )
        plt.style.use("seaborn-white")
        plt.figure( num = 1, figsize = (12, 9))
        plt.title("ROC scores summary", fontsize = 18)
        plt.xlabel("False Positive Rate" , fontdict = {"fontsize": 15})
        plt.ylabel("True Positive Rate" , fontdict = {"fontsize": 15})
        plt.plot(fpr, tpr, label='{0} ROC Score: {1}'.format(model_name[i] ,round(roc_auc_score(Y_true, Y_probability[i][:,1] ) ,2)))
        plt.legend(loc = 4, fontsize =13)
    plt.show()
roc_summary_plot(Y_test, [logr_Y_proba, dt_Y_proba, rf_Y_proba, XGB_Y_proba],
                         ["LogisticRegression", "DecisionTree" ,"Random Forest", "XGBClassifier"])
score_1 = metrics_scoring_table(logr_Y_pred,Y_test, logr_Y_proba ,"LogisticRegression")
score_2 = metrics_scoring_table(dt_Y_pred,Y_test, dt_Y_proba ,"Decision Tree")
score_3 = metrics_scoring_table(rf_Y_pred,Y_test, rf_Y_proba ,"RandomForest")
score_4 = metrics_scoring_table(XGB_Y_pred,Y_test, XGB_Y_proba ,"XGBClassifier")
score = pd.concat([score_1,score_2,score_3,score_4], axis=0)
score

4.2 残差评估

plt.plot(model_names, accs, label='accuracy')
plt.scatter(model_names[-2],accs[-2],c='r')
# plt.plot(model_names, np.array(reds)/500,c='r', label='residuals')
plt.legend()
plt.show()

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

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

相关文章

【Java学习笔记】2.Java 开发环境配置

Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境。 window系统安装java 下载JDK 首先我们需要下载 java 开发工具包 JDK,下载地址:https://www.oracle.com/java/technologies/downloads/,在下载页面中根据自己的系统选…

企业寄件现代化管理教程

现代化企业为了跟上时代发展的步伐,在不断完善着管理制度,其中公司寄件管理,也是重要的一个模块。为了提高公司快递的寄件效率,以及节约寄件成本,实现快递寄件的规范化,越来越多的现代化企业,开…

ES linux 环境下安装问题集锦

1: 所有的环境配置安装完成后验证: curl -u elastic http://127.0.0.1:9400 输入密码;2:错误1:解决方法:配置连接的用户名与密码; 重启ES 错误2:[1]: max number of threads [2048] …

前端性能优化:浏览器的2种缓存方式,你了解吗?

在前端性能优化中,最重要的就是缓存,使用缓存可以极大的提升浏览器的响应速率。什么是缓存呢?当我们第一次访问某个网站时,浏览器会把网站中的图片等资源存储在电脑中,以备后续使用,第二次访问该网站时&…

c++继承机制

4-4继承(带参构造)_哔哩哔哩_bilibili 继承机制 4.1继承与派生的概念 继承 是指在已有类或称为基类的基础上创建新类,这个新类就是派生类。 单继承:由一个基类派生的类 多继承:由两个或多个基类派生的类 派生类的…

【Windows】【Linux】---- Java证书导入

问题: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 无法找到请求目标的有效证书路径 一、Windows—java证书导入 1、下载证书到本地(以下…

理解Transformer

Transformer总体框架: 1、Encoder Encoder由 6 层组成,每一层包括两个子层:第一层 multi-head self-attention 层(8个heads),第二层是一个简单的全连接前馈网络。在每个子层后都接了一个残差连接以及归一化…

Linux命令行安装Oracle19c

安装 下载 从 Oracle官方下载地址 需要的版本,本次安装是在Linux上使用yum安装,因此下载的是RPM。另外,需要说明的是,Oracle加了锁的下载需要登录用户才能安装,而用户是可以免费注册的,这里不做过多说明。 …

JavaScript简述

JavaScript简述JavaScript简介JS用法JavaScript输出window.alert()document.write()innerHTML()console.log()JavaScript简介 JavaScript是脚本语言,可用于HTML和web。 …

Vue项目中引入高德地图步骤详解

高德地图API官网:高德开放平台 | 高德地图API。 目录 一、案例效果 二、开发准备 1. 注册高德开放平台账号 2. 创建应用添加 key 值 三、项目中使用地图组件 1. npm 获取高德地图 API 2.在项目中新建 MapContainer.vue 文件,用作地图组件。 3.在…

SpringBoot-运维篇

在运维实用篇中,是玩转配置,为开发实用篇中做各种技术的整合做好准备工作。与开发实用篇相比,运维实用篇的内容显得略微单薄,并且有部分知识模块在运维实用篇和开发实用篇中都要讲一部分,这些内容都后置到开发实用篇中…

python实现PCA降维画分类散点图并标出95%的置信区间

此代码以数据集鸢尾花为例,对其使用PCA降维后,绘制了三个类别的样本点和对应的置信圆(即椭圆)。先放效果图。 下面是完整代码: from matplotlib.patches import Ellipsedef plot_point_cov(points, nstd3, axNone, **…

Windows环境搭建Android开发环境-Android Studio/Git/JDK

Windows环境搭建Android开发环境-Android Studio/Git/JDK 因为休假回来后公司的开发环境由Ubuntu变为了Windows,所以需要重新配置一下开发环境。 工作多年第一次使用Windows环境进行开发工作,作次记录下来。 一、 Git安装 1.1git 标题软件下载 网址&…

CISA 告诉机构优先考虑什么以满足网络安全日志要求

随着联邦机构努力满足 2021 年发布的网络安全记录要求,政府的主要网络安全部门发布了一般指南,以帮助机构领导者优先考虑可能是昂贵且资源密集型实施的部分内容。 管理和预算办公室于 2021 年 8 月发布了一份备忘录,要求各机构创建和维护某些…

linux下nm,objdump和ldd三大工具使用

linux下进行C/C开发时经常需要使用nm&#xff0c;objdump&#xff0c;ldd工具来分析定位问题&#xff0c;本篇文章就对其做个总结&#xff1a; 1.测试程序 TestSo.h #pragma once #include <iostream>extern "C" int CTypeAdd(int x, int y); extern "…

关于Git分支高级合并的一些笔记整理

写在前面 分享一些 Git 高级合并的笔记博文为《Pro Git》读书笔记整理感谢开源这本书的作者和把这本书翻译为中文的大佬们理解不足小伙伴帮忙指正&#xff0c;书很不错&#xff0c;感兴趣小伙伴可以去拜读下 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&a…

传统图像处理方法实现车辆计数

本文通过传统OpenCV图像处理方法实现单向行驶的车辆计数。用于车辆检测的视频是在https://www.bilibili.com/video/BV1uS4y1v7qN/?spm_id_from333.337.search-card.all.click里面下载的。 思路一&#xff1a;来自B站某教程。大致是在视频中选取一窄长条区域&#xff0c;统计每…

【软件测试面试题】项目经验?资深测试 (分析+回答) 我不信你还拿不到offer......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在面试过程中&#…

Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作

场景 Sqlite数据库 SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不…

day03

文章目录一、盒子模型1. 基础概念2. 外边距3. 边框1) 边框实现2) 单边框设置3) 网页三角标制作4) 圆角边框5) 轮廓线2. 内边距3. 盒阴影4. 盒模型概念5. 标签最终尺寸的计算5. 标签最终尺寸的计算一、盒子模型 1. 基础概念 ​ 盒子模型分别由外边距、边框、内边距和标签内容组…