当前位置:   article > 正文

实践作业:经典机器学习案例——淡水资源监测_机器学习 赋能 水质

机器学习 赋能 水质

第一章 案例描述

一、淡水资源监测问题

1.1.1 问题描述

        淡水是我们最重要和最稀缺的自然资源之一,仅占地球总水量的 3%。它几乎触及我们日常生活的方方面面,从饮用、游泳和沐浴到生产食物、电力和我们每天使用的产品。获得安全卫生的供水不仅对人类生活至关重要,而且对正在遭受干旱、污染和气温升高影响的周边生态系统的生存也至关重要。因此,利用机器学习技术预测淡水质量是一项至关重要的任务,关乎人类的生存安全和生态系统的健康。淡水的稀缺性和重要性使得对其质量进行准确预测和监测至关重要,这需要结合大数据和机器学习算法,以便及时发现潜在的污染源和改善水质。通过利用机器学习技术,我们可以更有效地保护淡水资源,确保其持续可持续利用,从而维护人类生活的健康和生态系统的平衡。

1.1.2 数据集

https://filerepo.idzcn.com/hack2023/datasetab75fb3.zip

数据集特征:
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:是否为可使用淡水

第二章 案例解决方案

一、淡水资源监测方案

2.1.1 解决方案

        基于提供的淡水资源相关数据,训练一个或多个机器学习模型,有效预测淡水质量————这里使用推理时间F1分数作为评分的主要依据。

2.1.2 方案的实施

        根据机器学习的知识,对数据集首先进行数据探索,数据预处理,然后划分数据集,利用机器学习建立模型,并进行淡水质量的预测。在数据探索阶段,我们可以分析淡水质量数据的特征,探索数据之间的相关性和趋势,以帮助我们更好地理解数据集。数据预处理阶段包括缺失值处理、异常值检测等步骤,以确保数据的质量和准确性。接下来,我们将数据集划分为训练集和测试集,用训练集来训练机器学习模型,并用测试集来评估模型的性能。通过选择合适的机器学习算法和调整模型的参数,我们可以建立一个能够准确预测淡水质量的模型。这样的模型可以帮助我们及时识别淡水质量问题,并采取相应的措施来保护和改善淡水资源。利用机器学习技术进行淡水质量预测是一项有益且具有前景的研究方向,可以为淡水资源管理和保护提供重要的支持和指导。

2.1.3 所使用的工具

        英特尔® oneAPI Developer Cloud 是英特尔提供的基于云计算的开发平台,旨在帮助开发人员更轻松地使用英特尔的软件工具和硬件资源进行应用程序开发和优化。这个云平台提供了一系列工具和服务,使开发人员能够快速构建、测试和优化应用程序,同时利用英特尔的硬件优势提高性能和效率。

        Modin 是一个用于加速Pandas数据处理的 Python 第三方库。它通过在底层使用并行和分布式计算来提高数据处理性能,尤其适用于处理大规模数据集。Modin 的设计目标是在不修改现有代码的情况下实现性能提升,因此用户可以轻松地将现有的 Pandas 代码迁移到 Modin 中,从而获得更快的数据处理速度。

        Dask 是一个用于进行并行计算的灵活的 Python 库,旨在处理比内存更大的数据集。Dask 提供了高级的并行化接口,可以在多核 CPU 或者分布式集群上运行,从而加速数据处理和分析过程。Dask 支持并行化的数据结构,如数组、DataFrame 和Bag,使得用户可以方便地进行并行计算和数据处理。

2.1.4 导入数据包以及前置环境设置

  1. import os
  2. import xgboost
  3. from xgboost import XGBClassifier
  4. import time
  5. import warnings
  6. import numpy as np
  7. import seaborn as sns
  8. import matplotlib.pyplot as plt
  9. import plotly.io as pio
  10. import plotly.graph_objects as go
  11. from sklearn.utils import resample
  12. from sklearn.model_selection import train_test_split, StratifiedKFold, GridSearchCV, RandomizedSearchCV
  13. from sklearn.preprocessing import RobustScaler
  14. from sklearn.metrics import roc_auc_score, roc_curve, auc, accuracy_score, f1_score
  15. from sklearn.preprocessing import StandardScaler
  16. import sklearn
  17. from sklearn.metrics import precision_recall_curve, average_precision_score

装包导包 

  1. import os
  2. import zipfile
  3. train_path = './'
  4. with zipfile.ZipFile(train_path + 'train.zip') as zip_train:
  5. zip_train.extractall(train_path) # 解压训练集
  6. print("解压完成")

解压数据集 

  1. dataInfo = pd.read_csv('./dataset.csv')
  2. print("DataInfo shape: {}\n".format(dataInfo.shape))
  3. display(dataInfo.head())
  4. dataInfo.info()
  5. display(df.head())
  6. factor = pd.factorize(df['Color'])
  7. print(factor)
  8. df.Color = factor[0]
  9. factor = pd.factorize(df['Source'])
  10. print(factor)
  11. df.Source = factor[0]
  12. factor = pd.factorize(df['Month'])
  13. print(factor)
  14. df.Month = factor[0]
  15. df

 将数据进行转化

二、方案介绍

2.2.1 方案数据处理

        通过提供的淡水资源质量数据集,对数据首先进行数据预处理、利用机器学习建立模型,并进行数据的检测。

2.2.2 数据预处理

  1. display(dataInfo.isna().sum())
  2. missing = dataInfo.isna().sum().sum()
  3. duplicates = dataInfo.duplicated().sum()
  4. print("\nThere are {:,.0f} missing values in the data.".format(missing))
  5. print("There are {:,.0f} duplicate records in the data.".format(duplicates))

 处理缺失值与重复值

  1. print(dataInfo.Target.value_counts())
  2. target = dataInfo.Target.value_counts()
  3. target.rename(index={1: 'state 1', 0: 'state o'}, inplace=True)
  4. plt.pie(target, [0, 0.05], target.index, autopct='%1.1f%%')
  5. plt.show()

处理数据不平衡 

第三章 模型设计

一、 建立模型

  1. X = df.drop( ['Target','Iron', 'Zinc', 'Turbidity', 'Copper', 'Manganese'], axis=1)
  2. y = df['Target']
  3. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=21)
  4. scaler = StandardScaler()
  5. X_train_scaled = scaler.fit_transform(X_train)
  6. X_test_scaled = scaler.transform(X_test)
  7. print("Train Shape: {}".format(X_train_scaled.shape))
  8. print("Test Shape: {}".format(X_test_scaled.shape))
  9. X_train, X_test = X_train_scaled, X_test_scaled

数据切分

  1. param_grid = {
  2. 'max_depth': [10, 15, 20],
  3. "gamma": [0, 1, 2], # -> 0
  4. "subsample": [0.9, 1], # -> 1
  5. "colsample_bytree": [0.3, 0.5, 1], # -> 1
  6. 'min_child_weight': [4, 6, 8], # -> 6
  7. "n_estimators": [10,50, 80, 100], # -> 80
  8. "alpha": [3, 4, 5] # -> 4
  9. }
  10. scorers = {
  11. 'precision_score': make_scorer(precision_score),
  12. 'recall_score': make_scorer(recall_score),
  13. 'accuracy_score': make_scorer(accuracy_score),
  14. 'f1_score': make_scorer(f1_score),
  15. 'roc_auc_score': make_scorer(roc_auc_score),
  16. }

 网络搜索模型参数设置

  1. xgb = XGBClassifier(
  2. learning_rate=0.1,
  3. n_estimators=15,
  4. max_depth=12,
  5. min_child_weight=6,
  6. gamma=0,
  7. subsample=1,
  8. colsample_bytree=1,
  9. objective='binary:logistic', # 二元分类的逻辑回归,输出概率
  10. nthread=4,
  11. alpha=4,
  12. scale_pos_weight=1,
  13. seed=27)

 XGBoost 算法

  1. refit_score = "f1_score"
  2. start_time = datetime.datetime.now()
  3. print(start_time)
  4. rd_search = RandomizedSearchCV(xgb, param_grid, n_iter=10, cv=3, refit=refit_score, scoring=scorers, verbose=10, return_train_score=True)
  5. rd_search.fit(X_train, y_train)
  6. print(rd_search.best_params_)
  7. print(rd_search.best_score_)
  8. print(rd_search.best_estimator_)
  9. print(datetime.datetime.now() - start_time)

模型训练 

第四章 模型测试

一、 模型测试

  1. test_df = pd.read_csv('./test_data.csv')
  2. print("Data shape: {}\n".format(df.shape))
  3. display(df.head())
  4. df.info()
  5. display(test_df.head())
  6. factor = pd.factorize(df['Color'])
  7. print(factor)
  8. test_df.Color = factor[0]
  9. factor = pd.factorize(test_df['Source'])
  10. print(factor)
  11. test_df.Source = factor[0]
  12. factor = pd.factorize(test_df['Month'])
  13. print(factor)
  14. test_df.Month = factor[0]
  15. test_df
  16. test_df = test_df.drop(
  17. columns=['Index', 'Day', 'Time of Day', 'Month', 'Water Temperature', 'Source', 'Conductivity', 'Air Temperature'])
  18. test_df = test_df.fillna(0)
  19. test_df = df.drop_duplicates()
  20. test_df = test_df.drop(columns=['Lead'])
  21. test_df = test_df.drop(columns=['Target'])
  22. X_test = scaler.transform(test_df)
  23. import pandas as pd
  24. # 读取 test_data.csv 文件
  25. test_df = pd.read_csv('test_data.csv')
  26. # 提取 Target 列的值
  27. y_true = test_df['Target']
  28. from datetime import datetime
  29. # 记录开始时间
  30. inference_start_time = datetime.now()
  31. # 模型推理代码
  32. y_pred = rd_search.best_estimator_.predict(X_test)
  33. # 计算模型推理时间
  34. inference_time = datetime.now() - inference_start_time
  35. print("模型推理时间:", inference_time)
  36. # 计算模型在测试集上的f1分数并输出
  37. f1 = f1_score(y_true, y_pred)
  38. print("f1分数为:", f1)

 

第五章 结论

        通过本项目,我深刻认识到Intel在机器学习与数据挖掘领域的oneAPI具有重要作用。实际操作中,使用Intel AI Analytics Toolkit工具显著提升了问题解决效率。即使在处理数百万条数据时,模型拟合速度依然很快。这种体验在平时的机器学习课程中很少遇到。曾经在一个项目中,数据量较小,但运行时间长达一上午,结果仍不尽如人意。相比之下,本项目采用的工具表现出色,我相信未来工作和其他领域也能受益于这些强大的工具。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/752756
推荐阅读
相关标签
  

闽ICP备14008679号