DAY10:数据预处理基本步骤及模型与训练评估

@浙大疏锦行

题目:

1、数据预处理基本步骤(查看数据信息、缺失值补充、归一化/标准化、可视化)

2、模型与训练评估(svm、knn、朴素贝叶斯、逻辑回归、决策树、随机森林、XGBoost、LightGBM、catboost)

数据预处理
#导入库
import pandas as pd             #数据处理
import seaborn as sns           #高级绘图
import matplotlib.pyplot as plt #绘图
import numpy as np              #数值计算
from sklearn.preprocessing import StandardScaler, MinMaxScaler #归一化、标准化


#解决中文显示问题 plt.rcParams
plt.rcParams['font.sans-serif'] = ['simHei'] #windows常用黑体字体
plt.rcParams['axes.unicode_minus'] = False   #正常显示负号

#导入数据 .read_csv
heart_csv = pd.read_csv(r'D:\myown\software\vscode\files\sjx60practice\day4data\heart.csv')

#查看数据
heart_csv.info()         #数据整体情况,包括数据整体类型type、数据具体内容类型dtype、结构shape、非空值isnull、内存
type(heart_csv)          #数据类型
heart_csv['age'].dtype    #id列数据类型
heart_csv.shape          #数据结构,比如2行3列/索引
heart_csv.columns        #数据列名
heart_csv.describe()     #包括非空值数量、平均数、标准差、最大值、最小值、四分位数
heart_csv.head(10)       #前x行数据,默认为5

#复制几个副本,避免影响到原始数据 .copy()
heart_csv1 = heart_csv.copy()   
heart_csv2 = heart_csv.copy()

#非数值类:统一为数值,方便后续处理,如标签编码(有序)、独热编码(无序且量少,维度变多)、映射编码(需定制)
##标签编码 pd.factorize()
heart_csv1['thal_编码'] = pd.factorize(heart_csv1['thal'])[0] #适用于少量列,多量需循环,或用apply
    #编码多个 heart_csv['thal_编码','slope_编码'] = heart_csv[['thal','slope']].apply(lambda x:pd.factorize(x)[0],axis=0)0为默认-按列操作,1为按行操作
##独热编码 pd.get_dummies()
dis_l = []
a = heart_csv1.columns      #有哪些变量
for i in a:                 #利用循环筛出非数字变量
    if heart_csv1[i].dtype == 'object':
        dis_l.append(i)
heart_csv1 = pd.get_dummies(heart_csv1,columns=dis_l,drop_first=True)   
##映射标签 .map()
mappings = { 
    'cp':{'Ⅰ级':1,'Ⅱ级':2,'Ⅲ级':3,'Ⅳ级':4},
    'sex':{'女':0,'男':1}
}
heart_csv1['cp'] = heart_csv1['cp'].map(mappings['cp'])
heart_csv1['sex'] = heart_csv1['sex'].map(mappings['sex'])


#缺失值处理 .fillna()
#.mode()[]众数、.median()中位数、.mean()平均数、.quantile()分位数
b = list(heart_csv1.columns)                                                    #转化为列表方便循环
for i in b:
    if heart_csv1[i].dtype != 'object':                                             #找到为数值型的列
        if heart_csv1[i].isnull().sum() > 0:                                        #找到存在缺失值的列
            mode_values = heart_csv1[i].mode()                                      #计算该列众数
            if not mode_values.empty:                                               #判断众数是否存在
                mode_columns = mode_values[0]                                       #获取第一个众数
                heart_csv1[i] = heart_csv1[i].fillna(mode_columns, inplace=False)   #用众数填充缺失值
            else:
                print(f"列 {i} 的众数为空,无法填充缺失值")
#异常值处理
#一般不处理

#根据需要归一化和标准化
#归一化     MinMaxScaler().fit_transform([[]])   #最大值最小值归一化 #[[]]1个样本0个特征
#标准化     StandardScaler().fit_transform([[]])  

#可视化
#平均数最大小值.describe();【描述性统计文字版】
#箱线图         sns.boxplot() / 子图axes[].boxplot()
#直方图         sns.countplot()
#密度-直方图    sns.histplot()    
#分箱直方图     pd.cut() + sns.countplot()
#小提琴图       sns.violinplot()
#热图           .corr() + sns.heatmap()
#子图           plt.subplot() + i=? +axes[].xxxplot()
模型与训练评估
import warnings                     #用于忽略警告信息
warnings.filterwarnings("ignore")   #忽略所有警告信息

#划分需训练集、测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(                                    #X特征,y标签;X_train训练集特征,X_test测试集特征
                                                    heart_csv1.drop(columns='target'),  #去掉特征/自变量target列的值。作为矩阵X。避免训练时直接看到
                                                    heart_csv1['target'],               #单独提取target列,作为目标变量y
                                                    test_size=0.2,                      #测试集20%,训练集80%
                                                    random_state=10                     #固定随机种子,保证可复现性。随机选择即可
                                                    )                    
#target列在heart数据集中为分类变量,用于向量机随机森林等;如果连续变量可用于回归,根据题目要求换。保证'target'列实存在heart数据集中

from sklearn.metrics import classification_report, confusion_matrix                 #用于生成分类报告和混淆矩阵
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score    #用于评估分类器性能指标

#SVM
#特征尺度敏感,需标准化
from sklearn.svm import SVC
svm_model = SVC(random_state=42)                    #创意一个随机种子为42,svm分类对象
svm_model.fit(X_train, y_train)                     #用训练集的特征和标签训练svm模型
svm_pred = svm_model.predict(X_test)                #用训练好的模型对测试集的特征预测
classification_report(y_test, svm_pred)             #生成分类报告(需用print/可视化显示);结果包括精确率、召回率、二者调和平均数、每个类别样本数、准确率
confusion_matrix(y_test, svm_pred)                  #生成混淆矩阵(需用print/可视化显示),直观展示分类错误情况,计算特异度、误分类率
svm_precision = precision_score(y_test, svm_pred)   #单独计算精确率
svm_recall = recall_score(y_test, svm_pred)         #单独计算召回率
svm_f1 = f1_score(y_test, svm_pred)                 #单独计算F1分数
svm_accuracy = accuracy_score(y_test, svm_pred)     #单独计算准确率

#KNN
#特征尺度敏感,需标准化
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix             
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score
knn_model = KNeighborsClassifier()
knn_model.fit(X_train, y_train)
knn_pred = knn_model.predict(X_test)
classification_report(y_test, knn_pred)
confusion_matrix(y_test, knn_pred)
knn_precision = precision_score(y_test, knn_pred)   
knn_recall = recall_score(y_test, knn_pred)         
knn_f1 = f1_score(y_test, knn_pred)                 
knn_accuracy = accuracy_score(y_test, knn_pred)      

#格式相同不赘述

#逻辑回归
#特征尺度敏感,需标准化
from sklearn.linear_model import LogisticRegression

#朴素贝叶斯
#基于概率统计,与特征尺度无关,无需标准化
from sklearn.naive_bayes import GaussianNB

#决策树
#阈值分割特征,与特征尺度变化无关,无需标准化
from sklearn.tree import DecisionTreeClassifier

#随机森林
#阈值分割特征,与特征尺度变化无关,无需标准化
from sklearn.ensemble import RandomForestClassifier

#XGBoost
#适应不同特征尺度,无需标准化(但类别特征需特殊处理)
import xgboost as xgb

#LightGBM
#适应不同特征尺度,无需标准化(但类别特征需特殊处理)
import lightgbm as lgb

#catboost
#适应不同特征尺度,无需标准化(但类别特征需特殊处理)
from catboost import CatBoostClassifier
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值