能源大数据分析理论与实践 课件 10.煤炭大数据案例_第1页
能源大数据分析理论与实践 课件 10.煤炭大数据案例_第2页
能源大数据分析理论与实践 课件 10.煤炭大数据案例_第3页
能源大数据分析理论与实践 课件 10.煤炭大数据案例_第4页
能源大数据分析理论与实践 课件 10.煤炭大数据案例_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

煤炭大数据分析案例10CaseofCoalBigDataAnalysis10.1煤炭类型识别

案例描述:通过识别煤炭的类型,可以帮助矿工和科学家更好地了解煤炭的特性和用途,若将煤炭类型自动识别技术应用于机器,则可以实现对煤炭的自动识别与拣选。本案例描述了如何使用卷积神经网络(CNN)来实现煤炭类型的自动识别。本案例采用的数据集为4类煤炭的图片数据集,包括无烟煤(Anthracite)、烟煤(Bituminous)、褐煤(Lignite)和泥煤(Peat),数据来源于Kaggle。10.1.2实现步骤CNN模型的训练共包含7步。步骤1:数据收集和准备。收集煤炭图片数据集,确保每个类别都有足够数量的图片。将数据集划分为训练集和测试集,通常可以将20%或30%的数据作为测试集。步骤2:数据预处理。对图片进行预处理,包括调整图片大小、归一化像素值等,可以通过Python的图片处理库(OpenCV)来完成。步骤3:建立CNN模型。使用Python的深度学习框架(TensorFlow)建立CNN模型。CNN模型应包括卷积层、池化层和全连接层,以及适当的激活函数(如ReLU)和正则化技术(Dropout)。步骤4:模型训练。使用训练集对CNN模型进行训练,通过将图片数据传递给模型并提供相应的标签,模型将学习如何区分不同类型的煤炭。步骤5:模型评估。使用测试集评估训练后的CNN模型的性能,计算准确率、精确率、召回率等指标,以衡量模型在识别不同煤炭类型方面的表现。步骤6:模型优化(可选)。根据评估结果,可能需要调整CNN模型的超参数,如学习率、层数、卷积核大小等,以获得更好的性能。步骤7:预测新数据。当CNN模型完成训练并优化后,可以使用它来预测新的煤炭图片类型。将新的煤炭图片输入模型,并获取模型的预测结果。10.1.3程序实现与结果分析首先需要导入CNN模型使用的包,os用于识别文件路径,cv2用来读取和处理图片文件,pickle用于存储和读取数据(也可不使用),keras用于建立CNN模型。importnumpyasnpimportmatplotlib.pyplotaspltimportosimportcv2importpicklefromtensorflowimportkerasfromkeras.modelsimportSequentialfromkeras.layersimportDense,Activation,Flatten,Conv2D,MaxPooling2Dimportrandom10.1.3程序实现与结果分析对所有图片数据进行预处理,将所有图片处理成IMG_SIZE定义的像素大小的灰度图片。DATADIR="Coal_Classification"CATEGPRIES=["Anthracite","Bituminous","Lignite","Peat"]IMG_SIZE=50training_data=[]defcreate_training_data():forcategoryinCATEGPRIES:path=os.path.join(DATADIR,category)class_num=CATEGPRIES.index(category)forimginos.listdir(path):try:img_array=cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))training_data.append([new_array,class_num])exceptExceptionase:passcreate_training_data()10.1.3程序实现与结果分析然后打乱图片数据集的顺序,对所有图片提取特征(像素值)和标签,将数据序列化,并保存为X.pickle、y.pickle二进制文件。random.shuffle(training_data)X=[]y=[]forfeatures,labelintraining_data:X.append(features)y.append(label)pickle_out=open('X.pickle',"wb")pickle.dump(X,pickle_out)pickle_out.close()pickle_out=open('y.pickle',"wb")pickle.dump(y,pickle_out)pickle_out.close()10.1.3程序实现与结果分析加载X.pickle、y.pickle数据,利用Keras框架建立CNN模型,训练CNN模型。模型结构中采用了128个3×3的卷积核,模型结构并不是固定的,可以根据训练效果对卷积层进行增加或减少。Flatten后建立一个128个神经元的隐藏层(使用ReLU激活函数),输出层为4个神经元(使用Sigmoid型激活函数)。模型训练中使用SGD算法进行参数更新,其中学习率设置为0.05,将20%的数据作为验证集。最后进行绘图。X=pickle.load(open('X.pickle','rb'))y=pickle.load(open('y.pickle','rb'))X=np.array(X).reshape(-1,IMG_SIZE,IMG_SIZE,1)y=keras.utils.to_categorical(np.array(y))X=X/255.0model=Sequential()model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(128,(3,3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Flatten())model.add(Dense(128))10.1.3程序实现与结果分析model.add(Activation('relu'))model.add(Dense(4))model.add(Activation('sigmoid'))sgd=keras.optimizers.SGD(learning_rate=0.05)pile(loss='categorical_crossentropy',optimizer=sgd,metrics=['accuracy'])history=model.fit(X,y,batch_size=10,epochs=30,validation_split=0.2)model.save('model_cnn.h5')loss=history.history['loss']val_loss=history.history['val_loss']plt.plot(loss,label='loss')plt.plot(val_loss,label='val_loss')plt.title('modelloss')plt.ylabel('loss')plt.xlabel('epoch')plt.legend(['train','valid'],loc='upperleft')plt.savefig('./loss.png')10.1.3程序实现与结果分析model.save('model_cnn.h5')的作用是将模型结构和训练结果存储为H5类型的文件,需要安装好h5py包,才能正常运行该行代码。h5py包是Python中用于读取和写入HDF5文件格式数据的软件包,HDF5指的是层次型数据格式,主要用于存储和管理大数据集和复杂数据对象。这种存储模型的方式既可以存储神经网络的结构,又可以存储训练结果。训练完成后,可以使用存储的H5类型的文件进行新的应用。CNN模型的训练结果如图

10-1所示。可以看出,在训练集上CNN模型的准确率可以达到90%以上,而在验证集上并不理想,这主要是验证集的样本量不足导致的。图10-1CNN模型的训练结果10.1.3程序实现与结果分析训练完成后,可以加载CNN模型,利用CNN模型对新的图片进行识别分类,并输出分类结果。本案例中建立了名为to_predict_Bituminous的文件夹,随机挑选几张烟煤图片(复制几张图片粘贴于to_predict_Bituminous文件夹即可),加载模型并进行预测,代码如下。fromkeras.modelsimportload_modelimportnumpyasnpimportcv2importosIMG_SIZE=50DATADIR="Coal_Classification"CATEGPRIES=["Anthracite","Bituminous","Lignite","Peat"]model=load_model('model_cnn.h5')predict_imgs=[]DATADIR="Coal_Classification"path=os.path.join(DATADIR,"to_predict_Bituminous")10.1.3程序实现与结果分析forimginos.listdir(path):try:img_predict_array=cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)#将图片的大小统一为50像素×50像素new_array=cv2.resize(img_predict_array,(IMG_SIZE,IMG_SIZE))predict_imgs.append(new_array)exceptExceptionase:passpredict_imgs=np.array(predict_imgs).reshape(-1,IMG_SIZE,IMG_SIZE,1)predict_imgs=predict_imgs/255.0predict=model.predict(predict_imgs)print('5张烟煤图片的识别结果为:')forpredict_iinpredict:print("概率为%.3f,判断为%s"%(max(predict_i),CATEGPRIES[np.argmax(predict_i)]))10.2煤矿地震预测案例描述煤矿开采是一项非常危险的作业,如易燃气体积聚、岩石爆炸和隧道坍塌等,安全问题对煤矿生产影响巨大。因此,矿业公司必须考虑并尽可能规避这些危险,为矿工提供安全的工作条件。其中一类危险被称为“煤矿地震”或“煤矿诱发地震”,这是采煤活动引起的地下岩层应力重新分布和释放导致的,会危害矿工安全和造成设备损坏。但是,煤矿地震一般难以有效防范,甚至难以确定性地预测。当前,预测煤矿地震是机器学习和预测分析领域的一个难题。10.2.2模型方法与数据集本案例的目标是使用Logistic回归算法来预测地震中的能量读数和撞击次数是否会导致严重的地震危险并评估其预测准确性,以验证Logistic回归算法在解决这一问题上的效果。本案例使用了UCI机器学习库中一个名为“SeismicBumps”的数据集,其中包含大量的记录,涵盖各种分类和数值变量,可用于预测煤矿地震。这些数据来自波兰的Zabrze-Bielszowice煤矿的仪器,总共包括2584个记录。建立数据集的目的是使用一个工作班次期间的能量读数和撞击计数来预测下一个工作班次期间是否会发生“危险性撞击”。在这里,被定义为“危险性撞击”的事件是指地震事件的能量大于10000J,并且一个工作班次是指一个8小时的时间段。数据集中主要包含18个输入变量(特征)和1个二进制输出变量(标签),其说明如表

10-1所示。序号特征或标签变量说明1seismic表示通过地震方法获得的矿山工作中的班次地震危险评估结果,包含4个可能的值,分别表示不同的危险程度:a—无危险,b—低危险,c—高危险,d—危险状态2seismoacoustic表示通过声波地震方法获得的矿山工作中的班次地震危险评估结果,包含4个可能的值,分别表示不同的危险程度:a—无危险,b—低危险,c—高危险,d—危险状态3shift表示班次类型的信息,其中W代表采煤班次,N代表准备班次4genergy表示前一个班次中由最活跃的地震仪(GMax)记录的地震能量5gpuls表示前一个班次中GMax记录的地震脉冲的数量6gdenergy表示了前一个班次中GMax记录的能量与前八个班次中平均能量的差异7gdpuls表示前一个班次中GMax记录的脉冲数量与前八个班次中平均脉冲数量的差异8ghazard表示仅基于来自GMax的记录通过声波地震方法获得的矿山工作中的班次地震危险评估结果9nbumps表示前一个班次中记录的地震撞击的数量10nbumps2表示前一个班次中记录的撞击能量在范围[102,103)内的地震数量11nbumps3表示前一个班次中记录的撞击能量在范围[103,104)内的地震数量12nbumps4表示前一个班次中记录的撞击能量在范围[104,105)内的地震数量13nbumps5表示前一个班次中记录的撞击能量在范围[105,106)内的地震数量14nbumps6表示前一个班次中记录的撞击能量在范围[106,107)内的地震数量15nbumps7表示前一个班次中记录的撞击能量在范围[107,108)内的地震数量16nbumps89表示前一个班次中记录的撞击能量在范围[108,1010)内的地震数量17energy表示前一个班次中记录的地震撞击的总能量18maxenergy表示前一个班次中记录的地震撞击的最大能量19class数据集的标签,其中“1”表示在下一个班次中发生了高能量地震撞击(被认为是“危险状态”),而“0”表示在下一个班次中没有发生高能量地震撞击(被认为是“非危险状态”)表10-1数据集的特征和标签说明10.1.3程序实现与结果分析(1)数据集明显具有不均衡性,存在地震可能的记录明显少于正常情况,因此需要考虑对不均衡数据进行处理,以提升模型预测的准确性,原因在于Logistic回归算法对样本不均衡比较敏感。Logistic回归算法采用经验风险最小化作为模型的学习准则,即它的优化目标是最小化模型在训练集上的平均损失,这种算法天然地会将关注点更多地放在多数类别的拟合情况上,因为多数类别的分类正确与否,更加影响最终的整体损失情况。而在样本不均衡的建模任务中,人们常常更关注的是少数类别的分类正确与否,这就导致实际的建模目标和模型本身的优化目标是不一致的。10.1.3程序实现与结果分析(2)处理样本不均衡问题的方法一般分为两种:权重法和采样法。权重法分为类别权重法和样本权重法。类别权重法将权重加在类别上,若类别的样本量多,则类别的权重设低一些,反之类别的权重设高一些;样本权重法的权重加在样本上,若类别的样本量多,则其每个样本的权重低,反之每个样本的权重高。采样法可以分为上采样(或过采样)、下采样(或子采样)。上采样对样本量少的类别进行采样,直到和样本量多的类别量级差不多,SMOTE(SyntheticMinorityOver-samplingTechnique)是一种流行的过采样方法之一,它通过在少数类别样本之间合成新的样本来增加样本量,从而均衡数据集;下采样对样本量多的类别进行采样,直到和样本量少的类别量级差不多。10.2.3程序实现与结果分析1)数据的导入与清洗首先需要导入相关的库,然后使用arff.loadarff()函数加载刚刚下载的ARFF文件,这将返回两个值:data和meta,data是包含数据的结构化对象,meta是与数据相关的元数据(如特征信息)。使用pandas库创建一个DataFrame对象df,将data中的数据转换为DataFrame,使数据更容易分析和处理。将数据集中的类别变量转化为数值变量,这里使用Scikit-Learn(sklearn)库中的LabelEncoder类来将类别变量转换为标签编码。通过调用fit_transform方法,将每列中的类别变量转换为标签编码形式。数据的导入与清洗代码如下defETL_data():data,meta=arff.loadarff("seismic-bumps.arff")df=pd.DataFrame(data)label_encoder=LabelEncoder()df['seismic']=label_encoder.fit_transform(df['seismic'])df['seismoacoustic']=label_encoder.fit_transform(df['seismoacoustic'])df['shift']=label_encoder.fit_transform(df['shift'])df['ghazard']=label_encoder.fit_transform(df['ghazard'])mlb=MultiLabelBinarizer()df['class']=mlb.fit_transform(df['class'])returndf10.2.3程序实现与结果分析2)Logistic回归模型训练创建特征变量和目标变量的数据集,特征变量X定义为df中除'class'列外的所有其他列,使用drop方法从df中删除'class'列,目标变量y定义为'class'列。将数据集划分为训练集和测试集。使用train_test_split函数从特征变量X和目标变量y中创建4个数据集:X_train(训练集特征)、X_test(测试集特征)、y_train(训练集目标)、y_test(测试集目标)。10.2.3程序实现与结果分析2)Logistic回归模型训练test_size=0.2表示将数据集划分成80%的训练集和20%的测试集。这是一种常见的划分比例,但可以根据需要进行调整。LogisticRegression方法中penalty是正则化选项,主要有两种:“l1”和“l2”,默认为“l2”;C是正则化系数的倒数,其值越小,正则化越强,通常默认为1;solver用来指定Logistic回归的优化方法,liblinear表示使用坐标轴下降法来迭代优化损失函数,也可以选择其他方法;max_iter用来设置最大的迭代次数;random_state是随机种子,用于确保每次运行代码时都获得相同的随机划分。10.2.3程序实现与结果分析deftrain_and_predict(df):X=df.drop('class',axis=1)y=df['class']X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)model=LogisticRegression(penalty='l2',C=1.0,solver='liblinear',max_iter=100,random_state=42)model.fit(X_train,y_train)y_pred=model.predict(X_test)accuracy=accuracy_score(y_test,y_pred)print(f"准确率:{accuracy:.2f}")print(classification_report(y_test,y_pred))10.2.3程序实现与结果分析defsmote_train_predict(df):X=df.drop('class',axis=1)y=df['class']oversampler=SMOTE(sampling_strategy=0.5,random_state=0)os_features,os_labels=oversampler.fit_resample(X,y)counter=Counter(os_labels)print(counter)X_train_smote_sample,X_test_smote_sample,y_train_smote_sample,y_test_smote_sample=\train_test_split(os_features,os_labels,test_size=0.3,random_state=0)model=LogisticRegression(penalty='l2',C=1,solver='liblinear',max_iter=100,random_state=0)model.fit(X_train_smote_sample,y_train_smote_sample)y_pred=model.predict(X_test_smote_sample)accuracy=accuracy_score(y_test_smote_sample,y_pred)print(f"准确率:{accuracy:.2f}")print(classification_report(y_test_smote_sample,y_pred))上述代码未对不均衡数据进行处理,可以使用SMOTE方法对不均衡数据进行处理,代码如下。10.2.3程序实现与结果分析defsmote_train_predict(df):X=df.drop('class',axis=1)y=df['class']oversampler=SMOTE(sampling_strategy=0.5,random_state=0)os_features,os_labels=oversampler.fit_resample(X,y)counter=Counter(os_labels)print(counter)X_train_smote_sample,X_test_smote_sample,y_train_smote_sample,y_test_smote_sample=\train_test_split(os_features,os_labels,test_size=0.3,random_state=0)model=LogisticRegression(penalty='l2',C=1,solver='liblinear',max_iter=100,random_state=0)model.fit(X

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论