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

2024-03-20 14:30

本文主要是介绍【intel校企合作课程】预测淡水质量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.项目简介
    • 1.1项目描述
    • 1.2数据集展示
    • 1.3预期处理方案
    • 1.4Intel加速组件介绍
      • 1.4.1 Modin
      • 1.4.2 Daal4py
      • 1.4.3 Scikit-learn
      • 1.4.4 XGBoost
  • 2.数据探索
    • 2.1 数据集查看
    • 2.1查看数据描述性统计信息
    • 2.3将部分非数值型特征值转换为数值型特征值
    • 2.4数据可视化
      • 2.4.1 饼状图
      • 2.4.2 热力图
      • 2.4.3 条形图
    • 2.5相关性分析
    • 2.6删除不相关列
  • 3.数据预处理
    • 3.1 查看样本缺失值和重复行情况
    • 3.2处理样本缺失值和重复行情况
    • 3.3平衡数据
  • 4.XGBoost算法
  • 5.总结

1.项目简介

1.1项目描述

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

1.2数据集展示

数据集链接:https://filerepo.idzcn.com/hack2023/datasetab75fb3.zip

1.3预期处理方案

通过参考英特尔的类似实现方案,预测淡水是否可以安全饮用和被依赖淡水的生态系统所使用,从而可以帮助全球水安全和环境可持续性发展。这里分类准确度和推理时间将作为评分的主要依据。

1.4Intel加速组件介绍

1.4.1 Modin

Modin是一个强大的工具,可以帮助用户加速大规模数据分析的处理速度。它提供了与pandas兼容的API,使得用户可以无缝地在Modin和pandas之间切换,同时还提供了并行计算、可扩展性和易于使用等特性。

1.4.2 Daal4py

daal4py 是 Intel 提供的一个 Python 库,用于实现快速的数据分析和机器学习算法。

1.4.3 Scikit-learn

Scikit-learn组件为使用Scikit-learn进行机器学习的用户提供了显著的性能提升。通过利用Intel的硬件优化技术和跨设备兼容性,这个组件使得处理大规模数据集和运行复杂算法变得更加高效和便捷。

1.4.4 XGBoost

XGBoost组件为使用XGBoost进行机器学习的用户提供了更高的性能。通过利用Intel的硬件优化技术和改进数据加载处理方式,这个组件使得处理大规模数据集和运行复杂算法变得更加高效和快速。

2.数据探索

!pip install modin dask
import modin.pandas as pd
import os
import daal4py as d4p
os.environ["MODIN_ENGINE"] = "dask"from modin.config import Engine
Engine.put("dask")from sklearnex import patch_sklearn
patch_sklearn()

2.1 数据集查看

!pip install "dask[distributed]" --upgrade
data = pd.read_csv('Water/dataset.csv')
print('数据规模:{}\n'.format(data.shape))
display(data.head())

在这里插入图片描述

data.info()

在这里插入图片描述
该数据集总共有5956842条数据,代码展示了前5行的数据可以看到每条数据总共有24个特征。其中float64类型的特征有19列,int64类型的特征有2列,object类型的特征有3列,内存空间大约占了1.1GB。

2.1查看数据描述性统计信息

desc=data.describe()
# 显示描述性统计信息  
print(desc)

在这里插入图片描述查看数据集各个特征的非空值的数量、平均值、标准差、最小值、第一四分位数、中位数、第三四分位数、最大值。

2.3将部分非数值型特征值转换为数值型特征值

在这里插入图片描述

'Color’列特征值和’Source’列特征值通过factorize()函数从最开始的文本标签被替换成了整数标签。因为月份有特定的对应关系所以单独将’Month’对应映射到了1~12。

2.4数据可视化

2.4.1 饼状图

import matplotlib.pyplot as pltdef plot_target(target_col):tmp=data[target_col].value_counts(normalize=True)target = tmp.rename(index={1:'Target 1',0:'Target 0'})wedgeprops = {'width':0.5, 'linewidth':10}plt.figure(figsize=(6,6))plt.pie(list(tmp), labels=target.index,startangle=90, autopct='%1.1f%%',wedgeprops=wedgeprops)plt.title('Label Distribution', fontsize=16)plt.show() plot_target(target_col='Target')

在这里插入图片描述使用饼图来直观展示不同类别在目标列中的比例。

2.4.2 热力图

import seaborn as sns 
# 设置图形大小和 DPI  
fig, ax = plt.subplots(figsize=(30, 20), dpi=128)  
corr= sns.heatmap(data.corr(method='spearman'),annot=True,square=True)
plt.title('Spearman Correlation Heatmap')  
#显示图表
plt.show()

在这里插入图片描述通过热力图可以很直观的看出不同特征之间的相关性。

2.4.3 条形图

import numpy as np  # 导入numpy库并设置别名np  
bar = data.corr()['Target'].abs().sort_values(ascending=False)[1:]
# 设置图形大小  
plt.rcParams.update({'figure.figsize': (10, 5)})  
plt.bar(bar.index, bar, width=0.5)
plt.xticks(bar.index, bar.index, rotation=-60, fontsize=8)
# 显示图形标题  
plt.title('Absolute Correlation with Target')  
plt.show()

在这里插入图片描述条形图主要目的是展示数据集中除了’Target’列之外的其他列与’Target’列之间的绝对相关性的大小。

2.5相关性分析

通过热力图和条形图来看’Day’列、'Time of Day’列、'Month’列、'Water Temperature’列、'Source’列、'Conductivity’列、'Air Temperature’列与’Target’列的相关性很差,为了保留与目标变量有较强的关联的特征就将这些列从数据集中删除。

2.6删除不相关列

#删除不相关的列
data = data.drop(columns=['Day', 'Time of Day', 'Month', 'Water Temperature', 'Source' , 'Conductivity' , 'Air Temperature'])

3.数据预处理

3.1 查看样本缺失值和重复行情况

data = data.drop(columns=['Index'])

要先将’index’列删除,不然每条数据至少索引值是不同的就会得到重复值为0。
在这里插入图片描述不管是缺失还是重复数据数量都很大,缺失数据达到了1603858个,重复数据达到了143032条。

3.2处理样本缺失值和重复行情况

常见的处理缺失值方法:
1.删除含有缺失值的行或列:
如果缺失值很多,或者某一列缺失值过多,可以考虑直接删除该列或含有缺失值的行。
2.填充缺失值:
使用常数(如0、平均值、中位数、众数等)填充缺失值。
使用其他列的值来填充缺失值,例如使用同一分类下的其他列的平均值。
使用插值方法(如线性插值、多项式插值等)来预测缺失值。
使用机器学习算法(如KNN、决策树等)来预测缺失值。
3.不处理:
在某些情况下,缺失值可能表示某种信息,如用户未填写某项信息等。这种情况下,可以保留缺失值,不进行任何处理。
常见的处理重复行方法:
1.删除重复行:
使用 DataFrame.drop_duplicates() 方法删除重复行。
2.标记重复行:
使用 DataFrame.duplicated() 方法标记重复行,返回一个布尔型序列,表示每行是否是重复行。
标记后,可以根据需要进行进一步处理,如删除、高亮显示等。
3.合并重复行:
如果重复行包含不同的信息,可以考虑合并这些行。
可以使用 groupby 和 agg 方法对重复行进行分组和聚合操作,例如求和、求平均值等。

# 首先删除重复的行  
data = data.drop_duplicates()  # 然后计算每列的均值  
mean_values = data.mean()  # 使用每列的均值来填充该列的缺失值  
data_filled = data.fillna(mean_values)  # 我直接修改原始的DataFrame,而不是创建一个新的DataFrame  
data = data_filledmissing=data.isna().sum().sum()
duplicates=data.duplicated().sum()
print("\n数据集中有{:,.0f} 缺失值.".format(missing))
print("数据集中有 {:,.0f} 重复值.".format(duplicates))

在这里插入图片描述

3.3平衡数据

在这里插入图片描述
通过饼状图也可以直观看到Target 0:Target1 = 2.31:1,当类别不平衡时,模型的性能可能会受到影响所以需要后续数据的平衡。

常见的平衡数据的方法:
1.上采样:对于数量较少的类别,通过复制样本或生成合成样本来增加其数量。常用的上采样方法有SMOTE(Synthetic Minority Over-sampling Technique)等。
2.下采样:对于数量较多的类别,随机选择部分样本来减少其数量,使得数据达到平衡状态。但这种方法可能会导致信息丢失。
3.调整分类器权重:
在训练过程中,可以为不同的类别设置不同的权重,使得模型在训练时更加关注少数类样本。例如,在使用支持向量机(SVM)时,可以通过设置不同的惩罚参数C来调整对不同类别的重视程度。
4.使用集成学习方法:
集成学习方法,如随机森林、梯度提升树等,可以通过组合多个基本分类器的预测结果来提高整体性能。在构建集成模型时,可以采用不同的采样策略来平衡数据,如Bagging、Boosting等。
5.生成对抗网络(GANs):
生成对抗网络可以用于生成新的样本,从而增加少数类样本的数量。通过训练一个生成器和一个判别器,GANs可以生成与真实数据分布相似的样本,从而缓解数据不平衡问题。
6.使用代价敏感学习(Cost-sensitive Learning):
代价敏感学习是一种让模型在训练时考虑到不同类别样本的误分类成本的方法。通过为不同类别的误分类设置不同的代价,可以使得模型在训练时更加关注少数类样本。

# 导入必要的库  
from imblearn.over_sampling import ADASYN  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler
# 分割特征和标签  
X = data.drop('Target', axis=1).values  
y = data['Target'].values  # 初始化ADASYN采样器  
adasyn = ADASYN(random_state=21)  # 使用ADASYN对特征和标签进行拟合和重采样  
X_resampled, y_resampled = adasyn.fit_resample(X, y)  # 将y_resampled转换为Pandas Series以便进行统计  
y_resampled_series = pd.Series(y_resampled)  # 查看平衡后的类别比例  
class_counts = y_resampled_series.value_counts()  
print("Balanced Class Counts:")  
print(class_counts)  

在这里插入图片描述

我使用的是ADASYN方法,它的主要思想是根据每个少数类别样本的邻近情况生成合成样本。ADASYN 为每个少数类别样本分配了一个权重,该权重表示该样本需要生成多少个合成样本。权重的计算基于该样本的邻近样本中多数类别的比例。如果一个少数类别样本的邻近样本中多数类别占据主导地位,那么它将获得更高的权重,从而生成更多的合成样本。通过结果可以看出经过平衡数据的处理Target 0:Target 1 = 1:1。

4.XGBoost算法

XGBoost算法介绍:
XGBoost采用集成思想——Boosting思想,将多个弱学习器通过一定的方法整合为一个强学习器,即用多棵树共同决策。每棵树的结果都是目标值与之前所有树的预测结果之差,并将所有的结果累加即得到最终的结果,以此达到整个模型效果的提升。
XGBoost算法特点:
1.效果好:在各种数据竞赛中大放异彩,而且在工业界也是应用广泛,这主要得益于其优异的效果
2.使用简单:用户只需调用几个函数即可实现强大的功能。
3.速度快:在处理大规模数据集时,XGBoost展现了其高效性。
4.可扩展性:XGBoost能够处理多种类型的数据,包括文本、数值等,这使得它在处理复杂问题时具有很高的灵活性。

import xgboost as xgb  
from sklearn.metrics import accuracy_score, f1_score, classification_report  
from time import time  # 将数据转换为DMatrix格式  
dtrain = xgb.DMatrix(X_train, label=y_train)  
dtest = xgb.DMatrix(X_test, label=y_test)  # 设置XGBoost参数  
param = {  'max_depth': 3,  # 树的最大深度  'eta': 0.3,      # 学习率  'objective': 'multi:softmax',  # 多分类的目标函数  'num_class': len(set(y_train))  # 类别数,设置为训练集中唯一标签的数量  
}  # 设置评估指标  
evals = [(dtrain, 'train'), (dtest, 'test')]  # 训练模型  
num_boost_round = 100
bst = xgb.train(param, dtrain, num_boost_round=num_boost_round, evals=evals, early_stopping_rounds=10)  # 获取最佳迭代次数
best_iteration = bst.best_iteration  # 使用最佳迭代次数进行预测  
y_pred_proba = bst.predict(dtest, ntree_limit=best_iteration)  # 将预测的概率转换为类别标签  
y_pred = [np.argmax(x) for x in y_pred_proba]  # 计算分类准确度  
accuracy = accuracy_score(y_test, y_pred)  
print(f"Accuracy: {accuracy:.2f}")  # 计算F1分数  
f1 = f1_score(y_test, y_pred, average='macro')  
print(f"F1 Score: {f1:.2f}")  # 打印完整的分类报告  
report = classification_report(y_test, y_pred)  
print(report)  
# 计算推理时间  
start_time = time()  # 使用最佳迭代次数进行预测  
y_pred_proba = bst.predict(dtest, iteration_range=(0, best_iteration + 1))  # 确保 y_pred_proba 是一个二维数组  
if y_pred_proba.ndim == 1:  # 如果是一维数组,则将其重塑为二维数组,每行一个样本  y_pred_proba = y_pred_proba.reshape(-1, 1)  # 找到每行最大值的索引作为预测类别  
y_pred = np.argmax(y_pred_proba, axis=1)  end_time = time()  
inference_time = end_time - start_time  
print(f"Inference time: {inference_time:.2f} seconds")  

直接使用XGBoost算法训练模型发现最后的效果不是很好,所以考虑到使用参数优化来优化模型。
常见参数优化的方法:
1.网格搜索(Grid Search):这是最简单和最直接的方法,它通过穷举所有可能的参数组合来找到最优的参数。然而,由于需要尝试的参数组合可能非常多,因此这种方法可能会非常耗时。
2.随机搜索(Random Search):随机搜索是一种更高效的参数优化方法,它随机选择参数组合而不是穷举所有可能。这种方法通常比网格搜索更快,因为它不需要尝试所有的参数组合。
3.贝叶斯优化(Bayesian Optimization):贝叶斯优化是一种基于概率模型的优化方法,它使用先前的结果来预测下一个可能的最佳参数。这种方法通常比网格搜索和随机搜索更有效,因为它能够在探索(寻找新的可能的最优解)和利用(在已知的最优解附近寻找更好的解)之间找到平衡。
4.梯度下降(Gradient Descent):这是一种迭代方法,通过计算损失函数对参数的梯度,然后按照梯度的反方向更新参数,从而找到使损失函数最小的参数。这种方法通常用于优化连续参数。
5.遗传算法(Genetic Algorithms):遗传算法是一种模拟自然选择和遗传学原理的优化方法。它通过选择、交叉和变异等操作来生成新的参数组合,并保留表现最好的参数组合。这种方法通常用于处理复杂的优化问题。
6.自适应优化算法(Adaptive Optimization Algorithms):这些算法如Adam、RMSprop等,它们通过调整学习率等参数来优化模型的训练过程。这些算法通常能够更快地收敛到最优解,并且在处理大规模数据集时表现良好。

使用随机搜索参数优化

import xgboost as xgb  
from sklearn.model_selection import RandomizedSearchCV  
from sklearn.metrics import make_scorer, accuracy_score  
from time import time  # 将数据转换为DMatrix格式  
dtrain = xgb.DMatrix(X_train, label=y_train)  
dtest = xgb.DMatrix(X_test, label=y_test)  # 定义参数网格  
param_grid = {  'max_depth': [3, 5, 7],  'eta': [0.1, 0.2, 0.3],  'gamma': [0, 0.25, 1.0],  'colsample_bytree': [0.5, 0.75, 1.0],  'subsample': [0.5, 0.75, 1.0]  
}  # 设置评估指标为准确率  
scoring = make_scorer(accuracy_score)  # 使用RandomizedSearchCV进行参数优化  
n_iter_search = 20  # 随机采样的参数组合数量  
random_search = RandomizedSearchCV(  estimator=xgb.XGBClassifier(objective='multi:softmax', num_class=len(set(y_train))),  param_distributions=param_grid,  n_iter=n_iter_search,  scoring=scoring,  n_jobs=-1,  # 使用所有可用的CPU核心  cv=5,  # 使用5折交叉验证  verbose=0,  # 不输出优化过程的信息  . random_state=42  # 保证结果的可复现性  
)   
random_search.fit(X_train, y_train)     # 使用最佳参数重新训练模型  
best_model = random_search.best_estimator_  

模型保存

model_filename = 'best_xgb_model.model'  
best_model.save_model(model_filename)  

使用验证集评估模型(数据集处理略)

import xgboost as xgb  
import numpy as np  
from sklearn.metrics import accuracy_score, f1_score, classification_report  
from time import time  # 加载模型  
loaded_model = xgb.Booster()  # 实例化Booster类  
loaded_model.load_model(model_filename)  # 加载训练好的模型文件# 记录开始时间  
start_time = time()  # 使用模型进行预测  
y_pred_proba_validation = loaded_model.predict_proba(X_validation)  
y_pred_validation = [np.argmax(x) for x in y_pred_proba_validation]  # 记录结束时间  
end_time = time()  # 计算推理时间  
inference_time = end_time - start_time  
print(f"Inference Time: {inference_time:.2f} seconds")  # 计算验证集上的分类准确度  
accuracy_validation = accuracy_score(y_validation, y_pred_validation)  
print(f"Validation Accuracy: {accuracy_validation:.2f}")  # 计算F1分数  
f1_validation = f1_score(y_validation, y_pred_validation, average='macro')  
print(f"Validation F1 Score: {f1_validation:.2f}")  

结果展示

在这里插入图片描述

5.总结

Intel的oneAPI在机器学习与数据挖掘领域中的作用不可忽视。它提供了一个统一的编程模型、一系列优化过的库和工具,以及与多种机器学习框架的集成能力,这些都有助于加速机器学习和数据挖掘应用的开发和执行效率。
通过本次项目实践,我对机器学习的基本步骤有了一个更深层次的理解。主要是从饼状图、热力图和条形图作为切入点进行数据可视化进一步分析了相关性。将相关性不高的列进行删除。本数据集有大量的缺失数据和重复行我采取的措施是删除重复行,对缺失数据进行均值填充。平衡数据我所采取的方法是ADASYN方法,ADASYN方法在处理不平衡数据集时具有显著的优势,可以提高模型的分类性能,特别是对于少数类别的学习效果。模型训练采用的是XGBoost算法,直接使用XGBoost算法训练模型效果不好。所以我考虑使用随机搜索参数优化,将训练好的模型进行保存然后用验证集进行评估,结果是准确率在0.87左右,f1分数在0.83左右。

这篇关于【intel校企合作课程】预测淡水质量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829758

相关文章

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

充电宝哪个牌子好?哪个充电宝质量好且耐用?六款口碑好充电宝

现如今大家都离不开电子设备,出门必备一款充电宝,如果手机、电脑没电了还能及时得到一个续航,恢复正常出行,但是说实话现在市面上的充电宝品类层次不齐,有些价格高但是品质一般,有些价格性价比可能会更高一点,但是却很少人知道,大家往往都去追求价格高的充电宝却忽略了自己选购充电宝的一个需求,盲目跟风入手的充电宝很大一部分是不适合自己的,今天小编就把自己多年来选购充电宝的一些小技巧分享给大家!以便大家选购合适

金蝶盘点机PDA,序列号SN管理扫描入库出库质量追溯溯源防串货

比如有5个红米手机,红米手机的代码是100001, 那么这5个红米手机的条码是:100001+001,100001+002,100001+003,100001+004,100001+005, 那么入库时,依次扫描这些条码,自动生成金蝶里的入库单。并记录序列号信息。这样能实现序列号追溯,以后通过序列号就能查询出来该序列号的产品是从哪里进货的什么时候进货的,什么时间销售给谁了。 第一步:商

更改ip后还被封是ip质量的原因吗?

不同的代理IP的质量相同,一般来说可以根据以下几个因素来进行判断: 1.可用率 可用率就是提取的这些代理IP中可以正常使用的比率。假如我们无法使用某个代理IP请求目标网站或者请求超时,那么就代表这个代理不可用,一般来说免费代理的可用率普遍较低。 2.响应速度 响应速度可以用耗费时间来衡量,即计算使用这个代理请求网站一直到得到响应所耗费的时间。时间越短,证明代理的响应速度越快,用户在测试时可

2023-2024 学年第二学期小学数学六年级期末质量检测模拟(制作:王胤皓)(90分钟)

word效果预览: 一、我会填 1. 1.\hspace{0.5em} 1. 一个多位数,亿位上是次小的素数,千位上是最小的质数的立方,十万位是 10 10 10 和 15 15 15 的最大公约数,万位是最小的合数,十位上的数既不是质数也不是合数,这个数是 ( \hspace{4em} ),约等于 ( \hspace{1em} ) 万 2. 2.\hspace{0.5em} 2.

机器学习回归预测方法介绍:优缺点及适用情况

机器学习中的回归任务是预测连续变量的值,这在金融、医疗、市场分析等领域有着广泛的应用。本文将介绍几种常见的机器学习回归方法,探讨它们的基本原理、优缺点及适用情况。 目录 1. 线性回归(Linear Regression) 2. 多项式回归(Polynomial Regression) 3. 决策树回归(Decision Tree Regression) 4. 随机森林回

biostar handbook(五)|序列从何而来和质量控制

测序仪 2017年一篇发表在Nature的综述"DNA sequencing at 40: past, present and future"介绍了DNA测序这40年的发展历程。1976年,Sanger和Coulson同时发表了2种方法用于对上百个DNA碱基进行解码,这就是第一代测序技术。到了2005年,罗氏的454平台揭开了高通量测序的序幕,后面则是SOLiD,454和Illumina三方对抗

首次使用回声状态网络 (ESN) 和语音特征进行帕金森病 (PD) 预测

帕金森病(Parkinson's disease, PD)是一种使人衰弱的神经退行性疾病,它需要进行精确和早期的诊断,以便为患者提供有效的治疗和护理。这种疾病是由James Parkinson在1817年首次确定的,其特征是多巴胺生成神经元的退化。多巴胺的不足导致了一系列症状,包括静止性震颤、肌肉僵硬、运动迟缓(姿势不稳定)、以及其他重要特征,如睡眠障碍、心律失常、便秘和语音变化,这

Excel做简单的趋势预测

这种方法不能代替机器学习,时序分析等,只是为后面的时序预测提供一个经验认识。 step1         选中序号列(或时间列)与预测列如图1所示: 图1 step2         工具栏点击“数据”,然后再“数据”下点击“预测模型”,如图2所示: 图2 step3         这样就会跳出窗口,此处可以进行一些参数设置如图3所示: 图3

查询课程编号以'c05'开头,被3名及以上学生选修且期末成绩的平均分高于75分的课程号、选修人数和期末成绩平均分,并按平均分降序排序

--查询课程编号以'c05'开头,被3名及以上学生选修--且期末成绩的平均分高于75分的课程号、选修人数--和期末成绩平均分,并按平均分降序排序use teachinggoselect courseno,count(studentno)as '选修人数',avg(final) as '期末平均分'from scorewhere courseno like 'c05%' and fi