本文主要是介绍【Intel校企合作课程】淡水预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 作业简介:淡水预测
1.1 问题描述
淡水是我们最重要和最稀缺的自然资源之一,仅占地球总水量的 3%。它几乎触及我们日常生活的方方面面,从饮用、游泳和沐浴到生产食物、电力和我们每天使用的产品。获得安全卫生的供水不仅对人类生活至关重要,而且对正在遭受干旱、污染和气温升高影响的周边生态系统的生存也至关重要。
在这个问题中,我们所需解决的是一个机器学习分类挑战——可非饮用水二分类问题。即,我们的任务是建立一个二分类模型,能够准确地判断采得样品是饮用水还是非饮用水。
1.2 预期解方案
通过参考英特尔的类似实现方案,预测淡水是否可以安全饮用和被依赖淡水的生态系统所使用,从而可以帮助全球水安全和环境可持续性发展。这里分类准确度和推理时间将作为评分的主要依据。
1.3 数据集
https://filerepo.idzcn.com/hack2023/datasetab75fb3.zip
2. 数据处理
2.1 数据预处理
导所需要的包
import modin.pandas as pd
import os
import xgboost
from xgboost import XGBClassifier
import time
import warningsimport 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 resamplefrom 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
并导入我们此次intel加速组件所需要的包,来加速训练和预测速度
import daal4py as d4p
os.environ["MODIN_ENGINE"]="dask"
import modin.pandas as pd
from modin.config import Engine
Engine.put("dask")from sklearnex import patch_sklearnpatch_sklearn()
2.2 读入数据集和显示
df = pd.read_csv('data/dataset.csv')
print("Data shape: {}\n".format(df.shape))
display(df.head())df.info()
2.3 数据集探索性分析
对各特征的缺失值、重复值进行统计,并将结果输出。
display(df.isna().sum())
missing = df.isna().sum().sum()
duplicates = df.duplicated().sum()
print("\nThere are {:,.0f} missing values in the data.".format(missing))
print("There are {:,.0f} duplicate records in the data.".format(duplicates))
对缺失值、重复值进行处理
df = df.fillna(df.interpolate(method='linear'))
df = df.drop_duplicates()
display(df.isna().sum())
missing = df.isna().sum().sum()
duplicates = df.duplicated().sum()
print("\nThere are {:,.0f} missing values in the data.".format(missing))
print("There are {:,.0f} duplicate records in the data.".format(duplicates))
2.4 正负样本数据查看
#数据可视化
#通过饼状图直观反映数量对比。
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.5 将数据进行正态分布变化
3.模型训练
3.1 划分数据
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
3.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)
param_grid = {'max_depth': [10, 15, 20],"gamma": [0, 1, 2], "subsample": [0.9, 1], "colsample_bytree": [0.3, 0.5, 1], 'min_child_weight': [4, 6, 8], "n_estimators": [10,50, 80, 100],"alpha": [3, 4, 5]
}
3.3 训练结果验证
test_data = pd.read_csv('data/test_data.csv')test_data = test_data.drop(columns=['Index', 'Day', 'Time of Day', 'Month', 'Water Temperature', 'Source', 'Conductivity', 'Air Temperature'])
pd.factorize(test_data['Color'])
test_data.Color = factor[0]
test_data = test_data.fillna(test_data.interpolate(method='linear'))
test_data = test_data.drop_duplicates()log_col = ['Iron', 'Zinc', 'Turbidity', 'Copper', 'Manganese']
show_col = []
for col in log_col:test_data[col + '_log'] = np.log(test_data[col])show_col.append(col + '_log')
test_data = test_data.drop( ['Iron', 'Zinc', 'Turbidity', 'Copper', 'Manganese'], axis=1)y_true = test_data['Target']
X_test = test_data.drop(columns=['Lead', 'Target'])scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)from datetime import datetime
start = datetime.now()
y_pred = xgb.predict(X_test)
time = datetime.now() - start
f1 = f1_score(y_true, y_pred)print('\n模型推理时间: {}'.format(time))
print('模型在测试集上的f1分数: {}'.format(f1))
4. 总结
在研究中,我们根据数据集相关性进行特征筛选,以优化模型的拟合能力。通过处理数据集的缺失值、重复值和偏差值,数据变得更有效,有助于模型构建。我们采用了XGBoost进行模型训练,并借助随机网格搜索进行优化。在对测试集进行预测后,我们获得了76%的F1分数,预测时间约为0.25秒。尽管XGBoost在训练阶段耗时较长,但通过oneAPI提供的daal4py模型加速,推理速度显著提升。随着数据量的增加,在保证训练资源充足的情况下,模型准确率也将进一步提高。
这篇关于【Intel校企合作课程】淡水预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!