赞
踩
淡水是我们最重要和最稀缺的自然资源之一,仅占地球总水量的 3%。它几乎触及我们日常生活的方方面面,从饮用、游泳和沐浴到生产食物、电力和我们每天使用的产品。获得安全卫生的供水不仅对人类生活至关重要,而且对正在遭受干旱、污染和气温升高影响的周边生态系统的生存也至关重要。因此,利用机器学习技术预测淡水质量是一项至关重要的任务,关乎人类的生存安全和生态系统的健康。淡水的稀缺性和重要性使得对其质量进行准确预测和监测至关重要,这需要结合大数据和机器学习算法,以便及时发现潜在的污染源和改善水质。通过利用机器学习技术,我们可以更有效地保护淡水资源,确保其持续可持续利用,从而维护人类生活的健康和生态系统的平衡。
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:是否为可使用淡水
基于提供的淡水资源相关数据,训练一个或多个机器学习模型,有效预测淡水质量————这里使用推理时间与F1分数作为评分的主要依据。
根据机器学习的知识,对数据集首先进行数据探索,数据预处理,然后划分数据集,利用机器学习建立模型,并进行淡水质量的预测。在数据探索阶段,我们可以分析淡水质量数据的特征,探索数据之间的相关性和趋势,以帮助我们更好地理解数据集。数据预处理阶段包括缺失值处理、异常值检测等步骤,以确保数据的质量和准确性。接下来,我们将数据集划分为训练集和测试集,用训练集来训练机器学习模型,并用测试集来评估模型的性能。通过选择合适的机器学习算法和调整模型的参数,我们可以建立一个能够准确预测淡水质量的模型。这样的模型可以帮助我们及时识别淡水质量问题,并采取相应的措施来保护和改善淡水资源。利用机器学习技术进行淡水质量预测是一项有益且具有前景的研究方向,可以为淡水资源管理和保护提供重要的支持和指导。
英特尔® oneAPI Developer Cloud 是英特尔提供的基于云计算的开发平台,旨在帮助开发人员更轻松地使用英特尔的软件工具和硬件资源进行应用程序开发和优化。这个云平台提供了一系列工具和服务,使开发人员能够快速构建、测试和优化应用程序,同时利用英特尔的硬件优势提高性能和效率。
Modin 是一个用于加速Pandas数据处理的 Python 第三方库。它通过在底层使用并行和分布式计算来提高数据处理性能,尤其适用于处理大规模数据集。Modin 的设计目标是在不修改现有代码的情况下实现性能提升,因此用户可以轻松地将现有的 Pandas 代码迁移到 Modin 中,从而获得更快的数据处理速度。
Dask 是一个用于进行并行计算的灵活的 Python 库,旨在处理比内存更大的数据集。Dask 提供了高级的并行化接口,可以在多核 CPU 或者分布式集群上运行,从而加速数据处理和分析过程。Dask 支持并行化的数据结构,如数组、DataFrame 和Bag,使得用户可以方便地进行并行计算和数据处理。
- import os
- import xgboost
- from xgboost import XGBClassifier
- import time
- import warnings
-
- import numpy as np
- 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
- import sklearn
- from sklearn.metrics import precision_recall_curve, average_precision_score
装包导包
- import os
- import zipfile
-
- train_path = './'
- with zipfile.ZipFile(train_path + 'train.zip') as zip_train:
- zip_train.extractall(train_path) # 解压训练集
- print("解压完成")
解压数据集
- dataInfo = pd.read_csv('./dataset.csv')
- print("DataInfo shape: {}\n".format(dataInfo.shape))
- display(dataInfo.head())
- dataInfo.info()
-
- display(df.head())
- factor = pd.factorize(df['Color'])
- print(factor)
- df.Color = factor[0]
- factor = pd.factorize(df['Source'])
- print(factor)
- df.Source = factor[0]
- factor = pd.factorize(df['Month'])
- print(factor)
- df.Month = factor[0]
-
- df
将数据进行转化
通过提供的淡水资源质量数据集,对数据首先进行数据预处理、利用机器学习建立模型,并进行数据的检测。
- display(dataInfo.isna().sum())
- missing = dataInfo.isna().sum().sum()
- duplicates = dataInfo.duplicated().sum()
- print("\nThere are {:,.0f} missing values in the data.".format(missing))
- print("There are {:,.0f} duplicate records in the data.".format(duplicates))
-
处理缺失值与重复值
- print(dataInfo.Target.value_counts())
- target = dataInfo.Target.value_counts()
- target.rename(index={1: 'state 1', 0: 'state o'}, inplace=True)
- plt.pie(target, [0, 0.05], target.index, autopct='%1.1f%%')
- plt.show()
处理数据不平衡
- X = df.drop( ['Target','Iron', 'Zinc', 'Turbidity', 'Copper', 'Manganese'], axis=1)
- y = df['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
数据切分
-
- param_grid = {
- 'max_depth': [10, 15, 20],
- "gamma": [0, 1, 2], # -> 0
- "subsample": [0.9, 1], # -> 1
- "colsample_bytree": [0.3, 0.5, 1], # -> 1
- 'min_child_weight': [4, 6, 8], # -> 6
- "n_estimators": [10,50, 80, 100], # -> 80
- "alpha": [3, 4, 5] # -> 4
- }
-
- 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),
- }
网络搜索模型参数设置
- 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)
XGBoost 算法
- refit_score = "f1_score"
-
- start_time = datetime.datetime.now()
- print(start_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(datetime.datetime.now() - start_time)
模型训练
- test_df = pd.read_csv('./test_data.csv')
- print("Data shape: {}\n".format(df.shape))
- display(df.head())
-
- df.info()
-
- display(test_df.head())
- factor = pd.factorize(df['Color'])
- print(factor)
- test_df.Color = factor[0]
- factor = pd.factorize(test_df['Source'])
- print(factor)
- test_df.Source = factor[0]
- factor = pd.factorize(test_df['Month'])
- print(factor)
- test_df.Month = factor[0]
-
- test_df
-
-
- test_df = test_df.drop(
- columns=['Index', 'Day', 'Time of Day', 'Month', 'Water Temperature', 'Source', 'Conductivity', 'Air Temperature'])
-
- test_df = test_df.fillna(0)
- test_df = df.drop_duplicates()
-
- test_df = test_df.drop(columns=['Lead'])
- test_df = test_df.drop(columns=['Target'])
-
- X_test = scaler.transform(test_df)
-
- import pandas as pd
-
- # 读取 test_data.csv 文件
- test_df = pd.read_csv('test_data.csv')
-
- # 提取 Target 列的值
- y_true = test_df['Target']
-
- from datetime import datetime
-
- # 记录开始时间
- inference_start_time = datetime.now()
-
- # 模型推理代码
- y_pred = rd_search.best_estimator_.predict(X_test)
-
- # 计算模型推理时间
- inference_time = datetime.now() - inference_start_time
- print("模型推理时间:", inference_time)
-
- # 计算模型在测试集上的f1分数并输出
- f1 = f1_score(y_true, y_pred)
- print("f1分数为:", f1)
-
-
通过本项目,我深刻认识到Intel在机器学习与数据挖掘领域的oneAPI具有重要作用。实际操作中,使用Intel AI Analytics Toolkit工具显著提升了问题解决效率。即使在处理数百万条数据时,模型拟合速度依然很快。这种体验在平时的机器学习课程中很少遇到。曾经在一个项目中,数据量较小,但运行时间长达一上午,结果仍不尽如人意。相比之下,本项目采用的工具表现出色,我相信未来工作和其他领域也能受益于这些强大的工具。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。