【intel校企合作】预测淡水质量

目录

问题背景

问题描述

数据集

数据集下载

数据集特征

数据预处理

准备工作

导入相关包

导入Intel加速组件

数据探索

读取数据集

展示相关信息

数据预处理

数据映射

​相关性分析

处理偏差值

处理缺失值,重复值

可视化数据

特征分布

数据对数转换

数据平衡 

模型训练

模型定义

定义网络参数

定义XGBoost分类器

模型拟合

划分数据集

训练保存模型

模型推理

自设测试集测试模型

给定测试集测试模型

读取测试集

测试集预处理

测试模型

总结


问题背景

问题描述

        淡水是我们最重要和最稀缺的自然资源之一,仅占地球总水量的 3%。它几乎触及我们日常生活的方方面面,从饮用、游泳和沐浴到生产食物、电力和我们每天使用的产品。获得安全卫生的供水不仅对人类生活至关重要,而且对正在遭受干旱、污染和气温升高影响的周边生态系统的生存也至关重要。因此,利用机器学习技术预测淡水质量是一项至关重要的任务,关乎人类的生存安全和生态系统的健康。

数据集

数据集下载

点击此处下载

数据集特征

Index:编号
pH:水资源的pH值
Iron:含铁量
Nitrate:硝酸盐含量
Chloride:氯化物含量
Lead:铅含量
Zinc:锌含量
Color:淡水颜色
Turbidity:浑浊度
Fluoride:氟化物含量
Copper:铜含量
Odor:气味
Sulfate Conductivity:硫酸导电率
Chlorine Manganese :氯锰含量
Total Dissolved Solids :总溶解固体
Source Water :来源
Temperature :温度
Air Temperature :空气温度
Month :取水的月份
Day :取水的日期
Time of Day :取水的时间
Target:是否为可使用淡水

数据预处理

准备工作

导入相关包

#导入包
import os
import xgboost
from xgboost import XGBClassifier
import time
import warnings
 
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.io as pio
import plotly.graph_objects as go
from sklearn.utils import resample
 
from sklearn.model_selection import train_test_split, StratifiedKFold, GridSearchCV, RandomizedSearchCV
from sklearn.preprocessing import RobustScaler
from sklearn.metrics import roc_auc_score, roc_curve, auc, accuracy_score, f1_score
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import LabelEncoder
import sklearn
from sklearn.metrics import precision_recall_curve, average_precision_score
from sklearn.metrics import make_scorer, precision_score, recall_score, accuracy_score,f1_score, roc_auc_score  

导入Intel加速组件

#导入加速组件
import daal4py as d4p
import os
os.environ["MODIN_ENGINE"] = "dask"
import modin.pandas as pd
from modin.config import Engine
from sklearnex import patch_sklearn
patch_sklearn()

数据探索

读取数据集

df = pd.read_csv('./dataset.csv')

展示相关信息

print("DataFrame shape: {}\n".format(df.shape))
display(df.head())
df.info()

 

数据预处理

数据映射

#数据映射
label_encoder = LabelEncoder()
df['Source'] = label_encoder.fit_transform(df['Source'])
df['Month'] = label_encoder.fit_transform(df['Month'])
df['Color'] = label_encoder.fit_transform(df['Color'])

print(df.info())

相关性分析

#绘制热力图
plt.figure(figsize=(20, 10))
sns.heatmap(df.corr(), annot=True, cmap='bwr', fmt='.2f', xticklabels=df.columns, yticklabels=df.columns)

处理偏差值

# 过滤皮尔逊相关系数绝对值小于0.01的特征
col = df.corr()['Target']
selected_features = col[abs(col) >= 0.01].index
data = df[selected_features]

# 过滤缺失值大于20%的特征
missing_percentage_threshold = 0.2
missing_values = data.isnull().mean()
selected_features_no_missing = missing_values[missing_values <= missing_percentage_threshold].index
final_data = data[selected_features_no_missing]

# 检查并删除方差小于0.1的数值型特征
low_variance_features = final_data.var()[final_data.var() < 0.1].index
final_data = final_data.drop(columns=low_variance_features)
final_data = final_data.drop(columns=['Index'])
final_data_copy = final_data

处理缺失值,重复值

#检查缺失值,重复值
display(final_data.isna().sum())
missing = final_data.isna().sum().sum()#缺失值
duplicates = final_data.duplicated().sum()#重复值
print("\nmissing values: {:.0f} ".format(missing))
print("duplicate records: {:.0f} ".format(duplicates))

 

#插值法填充缺失值,删除重复值
final_data = final_data.fillna(final_data.interpolate())
final_data = final_data.drop_duplicates()
#验收数据处理
display(final_data.isna().sum())
missing = final_data.isna().sum().sum()#缺失值
duplicates = final_data.duplicated().sum()#重复值
print("\nmissing values: {:.0f} ".format(missing))
print("duplicate records: {:.0f} ".format(duplicates))

 

可视化数据

特征分布

#可视化特征数据分布
col_name = final_data.columns
final_data[col_name].hist(bins=50,figsize=(16,12))

数据对数转换

#进行对数转换
log_col = ['Iron', 'Turbidity', 'Copper', 'Manganese', 'Zinc']
loged_col = []
for col in log_col:
    final_data[col + '_log'] = np.log(final_data[col])
    loged_col.append(col + '_log')

final_data[loged_col].hist(bins=50, figsize=(16, 12))

 

数据平衡 

#检查数据平衡情况
target = final_data.Target.value_counts()
print(target)
target.index = target.index.map({1: 'non-freshwater', 0: 'freshwater'})
plt.pie(target, [0, 0.05], target.index, autopct='%1.1f%%')
plt.title('Distribution of Dataset')
plt.show()

 

模型训练

模型定义

定义网络参数

#定义网格搜索模型参数
param_grid = {
    'max_depth': [10, 15, 20],
    "gamma": [0, 1, 2],
    "subsample": [0.9, 1],
    "colsample_bytree": [0.3, 0.5, 1],
    'min_child_weight': [4, 6, 8],
    "n_estimators": [10,50, 80, 100],
    "alpha": [3, 4, 5]
}
#定义评分指标字典
scorers = {
    'precision_score': make_scorer(precision_score),
    'recall_score': make_scorer(recall_score),
    'accuracy_score': make_scorer(accuracy_score),
    'f1_score': make_scorer(f1_score),
    'roc_auc_score': make_scorer(roc_auc_score),
}

定义XGBoost分类器

#定义XGBoost分类器
xgb = XGBClassifier(
    learning_rate=0.1,
    n_estimators=15,
    max_depth=12,
    min_child_weight=6,
    gamma=0,
    subsample=1,
    colsample_bytree=1,
    objective='binary:logistic',
    nthread=4,
    alpha=4,
    scale_pos_weight=1,
    seed=27)

模型拟合

划分数据集

#划分训练样本和测试样本8:2
X = final_data.drop( ['Target','Iron', 'Turbidity', 'Copper', 'Manganese', 'Zinc'], axis=1)
y = final_data['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=21)
scaler = StandardScaler()#进行单位方差缩放来标准化特征
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print("Train Shape: {}".format(X_train_scaled.shape))
print("Test Shape: {}".format(X_test_scaled.shape))
X_train, X_test = X_train_scaled, X_test_scaled#更新为它们的缩放版本

训练保存模型

#训练模型
refit_score = "f1_score"
 
start_time = time.time()
rd_search = RandomizedSearchCV(xgb, param_grid, n_iter=10, cv=3, refit=refit_score, scoring=scorers, verbose=10, return_train_score=True)
rd_search.fit(X_train, y_train)
print(rd_search.best_params_)
print(rd_search.best_score_)
print(rd_search.best_estimator_)
print(f"训练时间:{time.time() - start_time} ")
#保存模型
model = rd_search.best_estimator_

模型推理

自设测试集测试模型

#模型推理:y_test
infer_start_time = time.time()

y_pred = model.predict(X_test)
 
infer_time = time.time() - infer_start_time
print("Used time:", infer_time)
y_test_f1 = f1_score(y_test, y_pred)
print('自设集F1 Score:', y_test_f1)

 

给定测试集测试模型

读取测试集

#读取测试集并查看数据
test_data = pd.read_csv('./test_data.csv')
print("Data shape: {}\n".format(test_data.shape))
display(test_data.head())
test_data.info()

 

 

测试集预处理

#测试集数据映射
label_encoder = LabelEncoder()
df['Source'] = label_encoder.fit_transform(df['Source'])
df['Month'] = label_encoder.fit_transform(df['Month'])
df['Color'] = label_encoder.fit_transform(df['Color'])

print(test_data.info())

#测试集数据预处理
selected_features = final_data_copy.columns
final_test_data = test_data[selected_features]
final_test_data = final_test_data.fillna(final_test_data.interpolate())
#进行对数转换
log_test_col = ['Iron', 'Turbidity', 'Copper', 'Manganese']
loged_test_col = []
for col in log_test_col:
    final_test_data[col + '_log'] = np.log(final_test_data[col])
    loged_test_col.append(col + '_log')

print(final_test_data.info())

 

测试模型

# 定义特征和目标变量
X_test_data = final_test_data.drop( ['Target','Iron', 'Turbidity', 'Copper', 'Manganese','Color'], axis=1)

y_test_data = final_test_data['Target']

infer_start_time = time.time()
 
# 进行模型预测
y_test_pred = model.predict(X_test_data)
 
infer_test_time = time.time() - infer_start_time
print("Used time:", infer_test_time)
test_data_f1 = f1_score(y_test_data, y_test_pred)
print('测试集F1 Score:', test_data_f1)

 ​​​​​​​​​​​​​​

总结

        在项目的探索过程中,我们根据数据集的相关性分析,识别了与目标相关的数据特征,并通过删除不相关的列来提升模型的拟合能力。对数据集进行了处理,包括处理缺失值、重复值和偏差,以增加数据集的有效性,为模型的建立创造了有利条件。在特征经过处理后,我们采用XGBoost进行模型训练,并利用随机网格搜索进行参数优化,成功地对给定的测试集进行了预测。

        虽然XGBoost在训练阶段可能需要较长的时间,但通过oneAPI提供的daal4py模型加速,我们在推理阶段实现了显著的速度提升。随着数据量的增加,在保证有足够训练资源的前提下,模型的准确率也有望进一步提高。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值