题目:
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