选题一:预测淡水质量

 1、项目介绍

1.、问题描述:

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

1.2、预期解决方案:

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

1.3、数据集

训练集链接:

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

2、数据准备

2.1、导入相关包
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
2.2使用intel加速组件
!pip install modin dask 
import modin.pandas as pd 
import os 
os.environ["MODIN_ENGINE"]="dask" 
from modin.config import Engine 
Engine.put("dask")
2.3 查看数据集
data=data.infer_objects()
data.info()

运行结果: 

 

import pandas
data=pandas.read_csv('dataset.csv') 
print('数据规模:{}\n'.format(data.shape)) 
display(data.head())

运行结果:

 

3、数据处理 

3.1处理缺失值 
data_Target_na = data[data['Target'].isna()]
na_index = list(data_Target_na.index)
data = data.drop(na_index)
data.drop_duplicates(keep='first',inplace=True,ignore_index=True)
missing=data.isna().sum().sum()
duplicates=data.duplicated().sum()
print("\n数据集中有{:,.0f}缺失值.".format(missing))
print("数据集中有 {:,.0f}重复值.".format(duplicates))

运行结果:

 

columns_check=['Source','Color','Month']    # 去除字符列中缺失值
data_target_na = data[data['Target'].isna()]
na_index = list(data_target_na.index)
check_data = data.drop(na_index)
check_data=check_data.dropna(subset=columns_check)
check_data=check_data.fillna(check_data.interpolate())   # 其余部分线性填充
check_data.drop_duplicates(keep='first', inplace=True, ignore_index=True)
 
missing = check_data.isna().sum().sum()
duplicates = check_data.duplicated().sum()
print("\n数据集中有{:,.0f} 缺失值.".format(missing))
print("数据集中有 {:,.0f} 重复值.".format(duplicates))

 运行结果:

#直看正常和异常类的数量
print('正常数据数里为{}'.format(len(data[data['Target']==0])))
print('异常数据数里为{}'.format(len(data[data['Target']==1])))
print('比例为{}:1'.format(int(len(data[data['Target']==0])/len(data[data['Target']==1]))))

运行结果:

 3.2因子化处理
 
df = data
# 因子化处理
factor_color = pd.factorize(df['Color'])
print(factor_color)
df['Color'] = factor_color[0].astype('float64')
 
factor_source = pd.factorize(df['Source'])
print(factor_source)
df['Source'] = factor_source[0].astype('float64')
 
factor_month = pd.factorize(df['Month'])
print(factor_month)
df['Month'] = factor_month[0].astype('float64')
 
display(df.head())

运行结果:

4、数据可视化

    4.1饼状图

代码: 

df = data
# 因子化处理
factor_color = pd.factorize(df['Color'])
print(factor_color)
df['Color'] = factor_color[0].astype('float64')
 
factor_source = pd.factorize(df['Source'])
print(factor_source)
df['Source'] = factor_source[0].astype('float64')
 
factor_month = pd.factorize(df['Month'])
print(factor_month)
df['Month'] = factor_month[0].astype('float64')
 
display(df.head())

运行结果:

 4.2柱状图

代码

bar = df.corr()['Target'].abs().sort_values(ascending=False)[1:]
 
plt.bar(bar.index, bar, width=0.5)
# 设置figsize的大小
pos_list = np.arange(len(df.columns))
params = {
    'figure.figsize': '20, 10'
}
plt.rcParams.update(params)
plt.xticks(bar.index, bar.index, rotation=-60, fontsize=10)
plt.show()

运行结果:

 
4.3热力图:

代码

corr = plt.subplots(figsize = (30,20),dpi=128)
corr= sns.heatmap(data.corr(method='spearman'),annot=True,square=True)

运行结果:

4、数据平衡

     4.1处理数据不平衡

print(df.Target.value_counts())
target = df.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()

运行结果:

 

5、XGBoost算法进行训练

   5.1 定义参数

from sklearn.metrics import make_scorer, precision_score, recall_score, accuracy_score,f1_score, roc_auc_score  
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),
}
5.2 分类器定义
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)
5.3 训练模型
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)

运行结果:

 

 6、预测推理

    6.1训练集测试
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)

6.2测试集测试
test_df = pd.read_csv('water/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)

运行结果: 

     通过推理时间和f1分数来看,训练效果不错。 

7、总结

        在这个项目中,我学到了很多关于水质预测和机器学习模型应用的知识和经验。通过数据处理、特征工程、模型训练和测试等环节,深入了解了如何构建一个完整的预测系统,并对模型优化和性能评估有了更深入的理解。

        同时在项目中,我发现数据质量对模型性能有着至关重要的影响,良好的数据清洗和特征工程能够提高模型的准确性和泛化能力。同时,模型选择和参数调优也是关键步骤,不同的模型和参数组合会对预测结果产生显著影响。

       总的来说,这个项目让我收获颇丰,通过数据处理、特征工程、模型训练和评估等步骤,实现了对水质状况的预测和监测。在项目中,我学习到了许多关于数据处理、机器学习模型应用和系统设计的知识,也积累了一定的实践经验。

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值