机器学习——数据赛入坑(二)_model.add(conv1d(16, 8,strides=2, activation='relu-程序员宅基地

技术标签: # 机器学习 项目比赛  机器学习  

热身:轴承故障检测训练赛

任务

轴承有3种故障:外圈故障,内圈故障,滚珠故障,外加正常的工作状态。如表1所示,结合轴承的3种直径(直径1,直径2,直径3),轴承的工作状态有10类:

参赛选手需要设计模型根据轴承运行中的振动信号对轴承的工作状态进行分类。

https://www.dcjingsai.com/common/cmpt/%E8%BD%B4%E6%89%BF%E6%95%85%E9%9A%9C%E6%A3%80%E6%B5%8B%E8%AE%AD%E7%BB%83%E8%B5%9B_%E7%AB%9E%E8%B5%9B%E4%BF%A1%E6%81%AF.html

https://www.knightdusk.cn/2019/06/bearing-fault-detect-based-on-mlp-and-feature-extraction/

http://www.yansongsong.cn/details-15.html

1.1 数据分析

  • 训练数据:792条,为时间序列数据:一条id列:1到792,数据列:每行长6000,Label列:为0到9。
  • 测试数据:528条,同训练数据一致:一条id列:1到528,数据列:每行长6000,无标签。

方案1:使用一维卷积神经网络处理时间序列数据——可以达到99%

1D CNN 可以很好地应用于传感器数据的时间序列分析(比如陀螺仪或加速度计数据);同样也可以很好地用于分析具有固定长度周期的信号数据(比如音频信号)。此外,它还能应用于自然语言处理的任务(由于单词的接近性可能并不总是一个可训练模式的好指标,因此 LSTM 网络在 NLP 中的应用更有前途)。

方案2:基于特征提取和多层感知器的轴承故障检测——可以达到100%

使用手工特征进行训练,如时域:平均值;方均根值,又称为有效值(表征振动能量的强度);最大值/方均根值(表征前文指出的周期性振动增强);2-10阶中心矩。和频域:FFT频谱来提取特征。

实现:(使用 1D CNN 先试试)

https://blog.csdn.net/xiaosongshine/article/details/89007098

流程:

  1. 数据读取与处理
  2. 网络模型搭建
  3. 模型的训练
  4. 模型应用与提交预测结果

1.数据读取预处理

# step 1/3 数据生成器
import numpy as np
import pandas as pd
import math

#把标签转成oneHot
def convert2oneHot(index,Lens):
    hot = np.zeros((Lens,))
    hot[int(index)] = 1
    return(hot)
MANIFEST_DIR = "../data/train.csv"
Batch_size = 20
Lens = 640 # 取640为训练和验证截点。
# 训练样本生成器——然后使用 keras 的 fit_generator 就可以不断调用 yield 的返回值
def xs_gen(path=MANIFEST_DIR, batch_size=Batch_size, train=True, Lens=Lens):
    data_list = pd.read_csv(path)
    if train:
        data_list = np.array(data_list)[:Lens]            # 取前Lens行的训练数据
        print("Found %s train items."%len(data_list))
        print("list 1 is",data_list[0,-1])
        steps = math.ceil(len(data_list) / batch_size)    # 确定每轮有多少个batch
    else:
        data_list = np.array(data_list)[Lens:]            # 取Lens行后的验证数据
        print("Found %s test items."%len(data_list))
        print("list 1 is",data_list[0,-1])
        steps = math.ceil(len(data_list) / batch_size)    # 确定每轮有多少个batch
    while True:
        for i in range(steps):
            batch_list = data_list[i * batch_size : i * batch_size + batch_size]
            np.random.shuffle(batch_list)
            batch_x = np.array([file for file in batch_list[:,1:-1]])
            batch_y = np.array([convert2oneHot(label,10) for label in batch_list[:,-1]])
            yield batch_x, batch_y

TEST_MANIFEST_DIR = "./data/test_data.csv"
def ts_gen(path=TEST_MANIFEST_DIR,batch_size = Batch_size):
    data_list = pd.read_csv(path)
    data_list = np.array(data_list)[:Lens]
    print("Found %s train items."%len(data_list))
    print("list 1 is",data_list[0,-1])
    steps = math.ceil(len(data_list) / batch_size)    # 确定每轮有多少个batch

    while True:
        for i in range(steps):
            batch_list = data_list[i * batch_size : i * batch_size + batch_size]
            batch_x = np.array([file for file in batch_list[:,1:]])
            yield batch_x

import matplotlib.pyplot as plt
if __name__ == "__main__":
    path = "../data/train.csv"
    # pandas 有 read_csv、shape 和 head
    data = pd.read_csv(path)
    #profile = data.profile_report(title='Dataset')
    #profile.to_file(output_file='result/Report.html')
    #print("data.shape", data.shape)
    #print("data.head", data.head)
    print(data)

    # pd 转 numpy 自动去除 head
    data = np.array(data)
    data = data[:Lens] # 取 0 到 Lens-1 行数据
    print("Found %s train items."% len(data))
    print(data)
    print(data.shape)
    print(data[0,-1]) # 数据[0,max]位置的值
    print(len(data))
    print(len(data[0]))
    #print(data[1,:])    # 第一行[0,:]、第二行[1,:]、第三行[2,:]、...
    #print(data[:,-1])   # 最后一列 —— 标签
    
    # ——————————————————————正式调用子程序
    count = 1
    while count <= 3: 
        show_iter = xs_gen()
        for x,y in show_iter:
            x1 = x[0]
            y1 = y[0]
            break
        print(y)
        print(x1.shape)
        plt.plot(x1)
        plt.show()
        count = count + 1
    pass

2.网络模型搭建

# step 2/3 模型制造
import keras
from keras.layers import *
from keras.models import *
from keras.optimizers import *
TIME_PERIODS = 6000
def build_model(input_shape=(TIME_PERIODS,),num_classes=10):
    model = Sequential()
    model.add(Reshape((TIME_PERIODS, 1), input_shape=input_shape))
    model.add(Conv1D(16, 8,strides=2, activation='relu',input_shape=(TIME_PERIODS,1)))

    model.add(Conv1D(16, 8,strides=2, activation='relu',padding="same"))
    model.add(MaxPooling1D(2))

    model.add(Conv1D(64, 4,strides=2, activation='relu',padding="same"))
    model.add(Conv1D(64, 4,strides=2, activation='relu',padding="same"))
    model.add(MaxPooling1D(2))
    model.add(Conv1D(256, 4,strides=2, activation='relu',padding="same"))
    model.add(Conv1D(256, 4,strides=2, activation='relu',padding="same"))
    model.add(MaxPooling1D(2))
    model.add(Conv1D(512, 2,strides=1, activation='relu',padding="same"))
    model.add(Conv1D(512, 2,strides=1, activation='relu',padding="same"))
    model.add(MaxPooling1D(2))
    """model.add(Flatten())
    model.add(Dropout(0.3))
    model.add(Dense(256, activation='relu'))"""
    model.add(GlobalAveragePooling1D())
    model.add(Dropout(0.3))
    model.add(Dense(num_classes, activation='softmax'))
    return(model)
if __name__ == "__main__":
    # reference:keras中文手册: https://keras.io/zh/models/model/    
    # 模型结构
    model = build_model()
    # 配置器
    model.compile(loss='categorical_crossentropy', optimizer=Adam(0.0002), metrics=['accuracy'])
    # 模型打印    
    print(model.summary())
    pass

 3.模型的训练

# step 3/3 模型优化器和训练
if __name__ == "__main__":
    # 1 数据初始化
    train_iter = xs_gen()
    val_iter = xs_gen(train=False)

    # 2.模型保存点
    ckpt = keras.callbacks.ModelCheckpoint(
        filepath='best_model.{epoch:02d}-{val_loss:.4f}.h5',
        monitor='val_loss', save_best_only=True,verbose=1)

    # 3.模型构建
    model = build_model()

    # 4.损失函数与优化器
    model.compile(loss='categorical_crossentropy', optimizer=Adam(0.0002), metrics=['accuracy'])
    # 模型打印:# print(model.summary())
    
    Long = 792
    # 5.模型训练,配合使用数据生成器
    model.fit_generator(
        generator = train_iter,
        steps_per_epoch = Lens//Batch_size,
        epochs = 50,
        initial_epoch = 0,
        validation_data = val_iter,
        nb_val_samples = (Long - Lens)//Batch_size,
        callbacks = [ckpt],
        )
    # 6.训练后的模型保存
    model.save("finishModel.h5")
    pass

4.模型应用与提交预测结果

import numpy as np
import pandas as pd
import math

# step 1/2 数据生成器
Batch_size = 20
Lens = 528 # 取640为训练和验证截点。
TEST_MANIFEST_DIR = "../data/test_data.csv"

def ts_gen(path = TEST_MANIFEST_DIR, batch_size = Batch_size):
    data_list = pd.read_csv(path)
    data_list = np.array(data_list)[:Lens]
    print("Found %s train items."%len(data_list))
    print("list 1 is",data_list[0,-1])
    steps = math.ceil(len(data_list) / batch_size)    # 确定每轮有多少个batch
    while True:
        for i in range(steps):
            batch_list = data_list[i * batch_size : i * batch_size + batch_size]
            batch_x = np.array([file for file in batch_list[:,1:]])
            yield batch_x

# step 2/2 模型读取与预测
from keras.models import *
import matplotlib.pyplot as plt
if __name__ == "__main__":
    # 测试数据的模型检测
    test_iter = ts_gen()
    model = load_model("best_model.40-0.0011.h5")
    pres = model.predict_generator(
        generator=test_iter,
        steps=math.ceil(528/Batch_size),
        verbose=1
        )
    print(pres.shape)
    ohpres = np.argmax(pres,axis=1)
    print(ohpres.shape)
    
    # 数据写入文件
    df = pd.DataFrame()
    df["id"] = np.arange(1,len(ohpres)+1)
    df["label"] = ohpres
    df.to_csv("submmit.csv",index=None)
    
    # 其他(可略)
    test_iter = ts_gen()
    for x in test_iter:
        x1 = x[0]
        break
    plt.plot(x1)
    plt.show()
    pass

名人堂

http://www.yansongsong.cn/   and github:https://github.com/xiaosongshine

http://www.yansongsong.cn/details-31.html

https://blog.csdn.net/xiaosongshine/article/details/89007098

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41275726/article/details/102837769

智能推荐

每天工作计划_算法工作计划-程序员宅基地

文章浏览阅读251次。如果坚持每天刷题3道,就离1200 codeforce不远了这周主要看:数据结构与算法 c++描述这本书_算法工作计划

Python 中的时间处理包datetime和arrow_python datetime的时间戳和arrow的时间戳不一样-程序员宅基地

文章浏览阅读1.8w次,点赞2次,收藏5次。Python 中的时间处理包datetime和arrow在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年、月、日等# 方法一:today = datetime.date.today() # 1. 获取「今天」first = today.replace(day=1) # 2. 获取当前月的第一天last_month = first - datetime.ti..._python datetime的时间戳和arrow的时间戳不一样

求字符串可匹配的最大长度_最长连续字符匹配-程序员宅基地

文章浏览阅读4.1k次。如:text=“abcdlijkfgd”,query=“abcdefg”,最大匹配为“abcd”_最长连续字符匹配

机器学习 Machine Learning- 吴恩达Andrew Ng 第11~15课总结-程序员宅基地

文章浏览阅读200次。YouTube课程地址https://www.youtube.com/playlist?list=PLOXON7BTL9IW7Ggbc09jLqGmzkwPI4-3V截止2021-5-3, 有112 个视频1. 第11课 Gradient descent intuition, Linear regression with one variableGradient descent intuition 阶梯下降算法介绍:a 表示 learning rate, 学习下降的速度右边的函数 deriv

支持向量机(SVM)凸二次规划的求解——序列最小最优化算法(SMO)原理及python实现_支持向量机转写为二次规划问题-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏32次。原问题:min⁡α12∑i=1N∑j=1NαiαjyiyjK(xi,xj)−∑i=1Nαi\min_\alpha\frac{1}{2}\sum_{i=1}^N\sum_{j=1}^N\alpha_i\alpha_jy_iy_jK(x_i,x_j)-\sum_{i=1}^N\alpha_iαmin​21​i=1∑N​j=1∑N​αi​αj​yi​yj​K(xi​,xj​)−i=1∑N​αi​s...._支持向量机转写为二次规划问题

基于docker的TensorFlow开发环境搭建_docker tensorflow no avx-程序员宅基地

文章浏览阅读378次。build docker-based tensorflow platform_docker tensorflow no avx

随便推点

MyBatis-Configuration-程序员宅基地

文章浏览阅读58次。一、引用properties 配置文件db.propertiesdriver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://192.168.8.136:3306/mybatisusername=rootpassword=rootmybatis-config.xml<!-- 外部 properties 配置文件 -..._mybatis整合configuration

adb unauthorized 解决方案-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏8次。查看Android设备的vid和pid方式adb shell查看VID:(oppo r9sk:22d9)cat/sys/class/android_usb/android0/idVendor查看PID:(oppo r9sk:276c)cat/sys/class/android_usb/android0/idProduct在PC端~/.android/目录下新建adb_usb.ini文件,有则不用新建。打开输入VID。..._adb unauthorized

机器学习—XGboost的原理、工程实现与优缺点_xgboost优缺点-程序员宅基地

文章浏览阅读6.9k次,点赞16次,收藏77次。文章目录一、xgboost简介二、xgboost原理1.从目标函数生成一棵树1.1学习第t颗树1.2xgboost的目标函数1.3泰勒公式展开1.4定义一棵树1.5定义树的复杂度1.6叶子节点归组1.7树结构打分2.一棵树的生成细节2.1最优切分点划分算法2.1.1贪心算法2.1.2近似算法2.2加权分位数缩略图2.3稀疏感知算法三、xgboost的工程实现3.1列块并行学习3.2缓存访问3.3 “核外”块计算四、xgboost的优缺点4.1优点4.2缺点一、xgboost简介  XGBoost是陈天奇_xgboost优缺点

Delphi连接AutoCAD_计算任意线条的长度宏的嵌套-程序员宅基地

文章浏览阅读142次。在AutoCAD里可以通过 List 和Area命令求的样条曲线等任意一条曲线的长度。但是要在delphi得到AutoCAD里任意一条曲线的长度就需要编写宏,然后再将宏嵌入到Delphi里这是在AutoCAD2004下调试通过的宏Sub SecFunc() Dim SelectionSet As AcadSelectionSet Dim lSpLine As ..._delphi autocad

数据结构-双向链表(c++)超全超详细_c++双向链表-程序员宅基地

文章浏览阅读1.5w次,点赞33次,收藏231次。文章目录前言一、双向链表是什么?二、双向链表上的基本操作1.定义双向链表2.初始化双链表3.前插法创建双链表4.尾插法创建双链表5.双向链表的遍历输出6.双链表的指定位置插入7.双链表的按位取值8.双链表的任意位置删除9.双链表的销毁三、全部代码(主函数部分比较凌乱)总结前言单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次顺序地向后遍历。要访问某个结点的前驱结点(插入,删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为O(n)。提示:以._c++双向链表

Azure + 5G + AI + IOT可以这么玩_azure 5g private-程序员宅基地

文章浏览阅读425次。欢迎转发扩散,这是对我最大的支持!5G场景下的三大特点分别对应着一些具体的业务场景,eMBB针对高清视频等系列应用;mMTC针对智慧城市等物联网应用;uRLLC针对工业控制或者远程驾驶等应用。在这几类场景中我们举个极端的案例:北京的某个工厂,控制系统在上海,我们在北京和上海之间拉了一根网线进行连接,那么设备执行了某个步骤之后,需要发请求到上海,上海的控制系统是一台奔三的服务器,这套系统显然不能工作对吧?采用何种改进才能正常工作呢?1.控制系统从远程下沉到工厂内部,2.设备和控制系统._azure 5g private

推荐文章

热门文章

相关标签