水质分析

2025年3月17日 | 阅读11分钟

获得饮用清洁水是每个人的基本需求之一。从法律上讲,获得清洁饮用水是一项基本人权。水质受多种因素影响,是机器学习研究的主要课题之一。因此,如果您想了解如何使用机器学习分析水质,本教程适合您。在本教程中,我们将引导您通过 Python 机器学习对水质进行分析。

导言:水质分析

分析水质是机器学习研究的关键课题之一。为了训练一个能够确定特定水样是否安全可饮用的机器学习模型,我们首先必须了解影响水饮用性的所有参数。这个过程也称为水饮用性分析。

我们将利用 Kaggle 数据集,其中包括影响水饮用性的所有关键要素的信息,用于水质分析挑战。在使用机器学习构建模型来预测水样是否适合饮用之前,我们必须首先快速检查此数据集的每个特征,因为所有决定水质的要素都至关重要。

关于数据集

内容

water_potability 数据集包含不同类型的水质指标。

  1. pH 值是确定水酸碱度的关键因素。此外,它还表明水是酸性还是碱性。根据世界卫生组织 (WHO) 的规定,允许的最高 pH 范围在 6.5 到 8.5 之间。本研究的 pH 范围在 6.52 到 6.83 之间,符合 WHO 标准。
  2. 硬度:钙和镁盐是硬度的主要贡献者。这些盐由水流经的地质构造释放。水暴露于产生硬度的物质的时间长短会影响水在原始状态下的硬度。水因钙和镁沉淀而形成肥皂的能力是硬度的原始定义。
  3. 固体:水可以溶解各种无机和某些有机矿物质或盐,例如钙、钾、钠、碳酸氢盐、氯化合物、镁、硫酸盐等。这些矿物质使水具有不愉快的味道并降低了颜色。这是用水时的关键变量。TDS 评级高的水是矿物质含量高的水。建议饮用水的 TDS 水平为 500 毫克/升,最大限制为 1000 毫克/升。
  4. 氯胺:氯和氯胺是城市供水系统中使用的两种主要消毒剂。当甲烷加入漂白剂以净化饮用水时,氯胺最常产生。在饮用水中,氯浓度高达 4 毫克/升被认为是安全的。
  5. 硫酸盐:硫酸盐是天然存在于岩石、土壤和矿物质中的有机化合物。它们存在于周围空气、地下水、植被和食物中。硫酸盐主要用于化工行业。在盐水中,每升约有 2,700 毫克硫酸盐。大多数淡水来源的浓度在 3 到 30 毫克/升之间,而某些地区的含量则高得多。
  6. 电导率:清洁的水是优良的绝缘体和不良的电流导体。离子浓度的增加提高了水的电阻。水的电导率通常由溶解颗粒的量决定。溶液传导电流的能力由其离子过程决定,通过电导率测量。根据 WHO 指南,EC 值不应超过 400 S/cm。
  7. 有机碳:人造和天然有机物 (NOM) 都促成了源水中的总有机碳。纯水中有机物质中的总碳量 (TOC) 是其测量值。美国环保署估计,处理过的饮用水的 TOC 为 2 毫克/升,用于处理的源水含有 4 毫克/升。
  8. 三卤甲烷 (THMs):三卤甲烷是氯化处理水中可能存在的物质。水中​​有机物的量、处理水所需的氯量以及处理水的温度都会影响饮用水中三卤甲烷的含量。三卤甲烷浓度高达 80 ppm 被认为是饮用水安全的。
  9. 浊度:水中悬浮的固体物质的量决定了其浊度。该测试用于确定排放废水的胶体颗粒质量,并测量水的发光能力。Wondo Genet 校区的平均浊度值 (0.98 NTU) 低于 WHO 建议的 5.00 NTU 阈值。
  10. 饮用性:介于 0 到 1 之间的分数,表示水是否适合人类饮用。

Python 水质分析

我们将通过导入数据集和所需的 Python 库来开始水质分析工作

源代码片段

输出

ph硬度固体氯胺硫酸盐电导率
0NaN204.59045520791.3159517.300212355.515441554.305554
13.715050129.42292115530.0575555.535245NaN592.555359
25.099124224.23525919909.5417329.275554NaN415.505213
35.315755214.37339422015.4174415.059332355.555135353.255515
49.092223151.10150917975.9553395.545500310.135735395.410513

在继续之前,让我们删除所有包含空值的行,因为我在数据集的初始预览中看到了它们

源代码片段

输出

ph                 0
Hardness           0
Solids             0
Chloramines        0
Sulfate            0
Conductivity       0
Organic_carbon     0
Trihalomethanes    0
Turbidity          0
Potability         0
dtype: int64

输入

输出

ph硬度固体氯胺硫酸盐电导率有机碳三卤甲烷浊度饮用性
count2785.0000003276.0000003276.0000003276.0000002495.0000003276.0000003276.0000003114.0000003276.0000003276.000000
均值7.080795196.36949622014.0925267.122277333.775777426.20511114.28497066.3962933.9667860.390110
std1.59432032.8797618768.5708281.58308541.41684080.8240643.30816216.1750080.7803820.487849
min0.00000047.432000320.9426110.352000129.000000181.4837542.2000000.7380001.4500000.000000
25%6.093092176.85053815666.6902976.127421307.699498365.73441412.06580155.8445363.4397110.000000
50%7.036752196.96762720927.8336077.130299333.073546421.88496814.21833866.6224853.9550280.000000
75%8.062066216.66745627332.7621278.114887359.950170481.79230416.55765277.3374734.5003201.000000
max14.000000323.12400061227.19600813.127000481.030642753.34262028.300000124.0000006.7390001.000000

输入

输出


RangeIndex: 3276 entries, 0 to 3275
Data columns ( total 10 columns ):
 0   Column           Non-Null Count  Dtype  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 0   ph               2785 non-null   float64
 1   Hardness         3276 non-null   float64
 2   Solids           3276 non-null   float64
 3   Chloramines      3276 non-null   float64
 4   Sulfate          2495 non-null   float64
 5   Conductivity     3276 non-null   float64
 6   Organic_carbon   3276 non-null   float64
 7   Trihalomethanes  3114 non-null   float64
 8   Turbidity        3276 non-null   float64
 9   Potability       3276 non-null   int64  
dtypes: float64( 9 ), int64( 1 )
memory usage: 256.1 KB

输入

输出

Hardness           3276
Solids             3276
Chloramines        3276
Sulfate            2495
Conductivity       3276
Organic_carbon     3276
Trihalomethanes    3114
Turbidity          3276
Potability            2
dtype: int64

输入

输出

Sum values
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -            
Hardness             0
Solids               0
Chloramines          0
Sulfate            781
Conductivity         0
Organic_carbon       0
Trihalomethanes    162
Turbidity            0
Potability           0
dtype: int64

输入

输出

ph                 float64
Hardness           float64
Solids             float64
Chloramines        float64
Sulfate            float64
Conductivity       float64
Organic_carbon     float64
Trihalomethanes    float64
Turbidity          float64
Potability           int64
dtype: object

由于此数据集的“饮用性”列包含值 0 和 1,分别表示系统中的水是否适合饮用(0),因此我们必须预测此列。现在查看“饮用性”列中 0 和 1 的分布

源代码片段

输出

Water Quality Analysis

您应该知道此数据集存在不平衡,因为 0 的样本数量多于 1 的样本数量。

正如之前所说,我们不能忽略任何影响水质的元素,因此让我们单独查看每一列。让我们从检查 pH 列开始

源代码片段

输出

Water Quality Analysis

pH 列显示水的 pH 值,这对于确定水的酸碱平衡至关重要。饮用水的 pH 值应在 6.5 至 8.5 之间。现在让我们检查影响水质的第二个元素

源代码片段

输出

Water Quality Analysis

上图显示了数据集中液体硬度的分布。水的硬度通常因其来源而异,但介于 120 至 200 毫克之间的水是可饮用的。现在让我们检查影响水质的以下元素

源代码片段

输出

Water Quality Analysis

上图显示了数据集中水中所有溶解固体的分布。溶解固体是水中发现的任何有机或无机矿物质。高度矿化的水具有非常高的溶解固体含量。现在让我们检查影响水质的下一个元素

源代码片段

输出

Water Quality Analysis

上图显示了数据集中水中二氧化氯的分布。在公共供水系统中,使用氯和氯胺等消毒剂。现在让我们检查影响水质的以下元素

源代码片段

输出

Water Quality Analysis

上图显示了数据集中水中硫酸盐的分布。它们是天然存在于矿物质、土壤和岩石中的元素。可饮用水被定义为含有少于 500 毫克硫酸盐。接下来,让我们检查另一个元素

源代码片段

输出

Water Quality Analysis

上图显示了数据集中流体电导率的分布。最纯净的水不是有效的电导体,但水总体上是优良的电导体。可饮用水的电阻小于 500。接下来,让我们检查另一个元素

源代码片段

输出

Water Quality Analysis

上图显示了数据集中水中碳化合物的分布。天然和人工来源的有机物质分解产生有机碳。可饮用水被定义为含有少于 25 毫克有机碳。现在让我们检查影响饮用水质量的以下元素

源代码片段

输出

Water Quality Analysis

上图显示了水中三卤甲烷或三氯甲烷的分布。氯化水含有称为三卤甲烷的化合物。可饮用水被定义为含有少于 80 毫克三卤甲烷。现在让我们检查数据集中影响饮用水质量的以下变量

源代码片段

输出

Water Quality Analysis

上图显示了水中浊度的分布。悬浮颗粒的数量影响水的浊度。可饮用水被定义为含有少于 5 毫克浊度。

基于 Python 的水质预测模型

上一节讨论了所有影响水质的元素。下一步是使用 Python 构建基于机器学习的水质分析模型。我将为此目的使用 Python PyCaret 包。如果您以前从未使用过此库包,可以使用 pip 命令快速将其安装到您的系统中

  • pycaret 安装

在构建机器学习模型之前,让我们看看所有特征与数据集的“饮用性”列之间的关联

源代码片段

输出

ph                 1.000000
Hardness           0.108948
Organic_carbon     0.028375
Trihalomethanes    0.018278
Potability         0.014530
Conductivity       0.014128
Sulfate            0.010524
Chloramines       -0.024768
Turbidity         -0.035849
Solids            -0.087615
Name: ph, dtype: float64

现在使用 PyCaret Python 模块来确定哪种机器学习方法适合此数据集

源代码片段

输出

模型精度AUC召回率精确度FaKappaMcC
if随机森林分类器0.68300.70050.41970.67440.51330.29760.3182
qda二次判别分析0.68230.71920.3985,0.68830.50130.29170.3174
et额外树分类器0.68160.69410.38610.68580.49160.28630.3123
lightgbm轻量级梯度提升机0.66520.69160.47620.60780.53240.27810.2840
gbe梯度提升分类器0.66020.67380.37180.63060.46670.24190.2603
nb朴素贝叶斯0.61840.60780.24780.5545,0.34120.12610.1462
dt决策树分类器0.60340.58950.51860.50490.50970.17750.1784
Ir逻辑回归0.59840.51990.00710.19000.01340.00280.0127
ridge岭分类器0.59840.00000.00890.1583.0.01680.00350.0056
Ida线性判别分析0.59770.49030.00890.15000.01670.00210.0024
adaAda Boost 分类器0.59560.56710.29190.48960.36440.09720.1034
knnK 近邻分类器0.57430.54230.36440.46420.40700.08260.0846
svmSVM - 线性核0.51940.00000.39820.16040.2287-0.0014-0.0104

上述结果表明,为了分析水质而训练基于机器学习的模型,最好使用随机预测分类技术。因此,让我们训练算法并评估其预测

源代码片段

输出

ph硬度固体氯胺硫酸盐
a.67e62473208000000002.050332 358.00613660286516
8.0222300000000000000006.546600 310.195738308.410813,
504067186:313524000000007544809 326.67630300000000
00000000000000002area 710546rst3408 3.6023062aaest6a4
e.635e490000000000000000( 4.563009 30330077100000000

电导率有机碳三卤甲烷浊度饮用性标签
18420524s00.341674oze7711
11558279000000004.07507511
8300735sastre82255970811
+3.780605000000002.67208911
42:36381762,7983094401425,11

上面显示的结果看起来不错。我希望您喜欢我基于 Python 的水质分析机器学习实验。

总结

因此,这就是您评估水质并训练机器学习模型以区分可饮用水和不可饮用水的方法。获得饮用清洁水是每个人的基本需求之一。从法律上讲,获得清洁饮用水是一项基本人权。水质受多种因素影响,是机器学习研究的主要课题之一。我希望您喜欢阅读这篇关于基于 Python 的水质分析机器学习教程。请随时通过邮件留下您的深刻见解。