python机器学习之SVM分类预测电芯状态

最近给公司做电芯状态分类,边搞边学了下数据处理和svm分类模型训练与调用

华丽的分割线------------------------------------------------------------
引入几个库:

import pandas as pd
from sklearn.model_selection import train_test_split#分割训练集和测试集前自动打散数据
from sklearn.preprocessing import Normalizer#归一化库函数
from sklearn.svm import SVR
import joblib
import matplotlib.pyplot as plt# 引入MATLAB相似绘图库,make_classification生成三元分类模型数据

首先,最重要的就是数据集了,这里先引用公司测量的数据样本,大约200个

#第一步 读取数据
#先定义下,将数据标签转换为数值
def dianxin_type(s):
    it = {'低压': 0, '正常': 1, '过压': 2}
    return it[s]

dianxin = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin.xls",encoding='utf-8',header =0,converters={5: dianxin_type})#完整数据 header=0去掉了表头

第二步,进行数据切片,取需要的行或者列:
用到iloc函数,[行开始:行结束;列开始:列结束]

#第二步 数据切片
x = dianxin.iloc[:,1:5]#取数据集的前4列为数据值
y = dianxin.iloc[:,-1]#后1列为数据标签
print("数据\n=",x)
print("数据标签\n=",y)

具体如下:
在这里插入图片描述
#第三步 划分训练集和测试集,(70%与30%)

#第三步 划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 0,train_size = 0.3)

其中,#test_size:样本占比,如果是整数的话就是样本的数量
#random_state:是随机数的种子。
#随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。

比如你每次都填1,其他参数一样的情况下得到的随机数组是一样的。但填0或不填,每次都会不一样。

#第四步:数据预处理:
数据预处理有很多方法,这里使用的比较简单的归一化:

#第四步 数据预处理,这里用的归一化
Normalizer().fit_transform(x_train)
Normalizer().fit_transform(x_test)

print("训练集=\n",x_train)
print("测试集=\n",x_test)

#第5步,配置支持向量机
这里用的线性核函数linear,当然还可以用多项式核函数poly和rbf核函数,这里的精度我们用show_accuracy函数来比较出来

#第5步,线性核函数配置支持向量机svr
linear_svc = svm.SVC(C=0.8, kernel = "linear",gamma=20)
#训练模型(用训练集将svr模型训练好)
linear_svc.fit(x_train,y_train)
#放入测试集后,预测测试结果
linear_svc_y_predict = linear_svc.predict(x_test)#y_hat
print("\n预测测试结果=",linear_svc_y_predict)


print("\n训练集精度:",linear_svc.score(x_train, y_train))   # 精度,socre函数评分
y_hat = linear_svc.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print("\n测试集精度:",linear_svc.score(x_test, y_test))
y_hat = linear_svc.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')


#也可以用多项式、rbf配置核函数
#poly_svr = SVR(kernel="poly") #多项式配置
#rbf_svr = SVR(kernel="rbf")   #rbf配置


打印如下:
在这里插入图片描述

#第六步,模型训练好了,当然要保存模型了(保存在.py文件的同一目录下),留着下次调用

#第6步 训练模型保存

joblib.dump(linear_svc, "dianxin_model_SVC.m")

#第7步,调用训练模型,这里是在同一py文件里调用

#第7步 调用训练模型
clf = joblib.load("dianxin_model_SVC.m")

#第8步,引入新数据(没有数据标签)来套用学习到的clf模型进行分类:

#第8步 用模型进行新数据分类
dianxin_new = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin_new.xls",encoding='utf-8',header =0)
dianxin_new = dianxin_new.sample(frac=1)#由于新数据是实际策略出来的 有点规律 这里将它打乱

#第9步 新数据分类

test_x = dianxin_new.iloc[:,1:5]#取数据集的前4列为数据值

print("新数据\n=",test_x)

test_y = clf.predict(test_x)#新数据经模型训练得到新标签分类
print("新数据电芯状态=\n",test_y)

test_x['电芯状态'] = test_y
print("新数据分类成功=\n",test_x)
plt.plot(test_y)
plt.legend(['0:low_Ubat,1:average,2:high_Ubat'])
plt.show()

plt图如下:
在这里插入图片描述
在这里插入图片描述
750多个数据 看起来有点乱:
0:电芯低压
1:电芯正常
2:电芯过压

分类完成,目前做的还是很简单,后面将在此基础上对大量数据进行分类,支持向量机适用于小样本的分类出来,后续或将调用其他机器学习算法。。。。。。

完整代码如下:

# -*- coding:utf-8 -*-
# 电芯状态识别svm
# 是最强的冰哥
from pandas import DataFrame
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib
from sklearn.preprocessing import StandardScaler
from sklearn import preprocessing
from sklearn import datasets
from sklearn.model_selection import train_test_split#分割训练集和测试集前自动打散数据
from sklearn import svm
from sklearn.preprocessing import Normalizer#归一化库函数
import numpy as np
from sklearn.svm import SVR #SVC解决多分类问题,SVR用于支持回归机做曲线拟合、函数回归 ,做预测,温度,天气,股票
import joblib
import matplotlib.pyplot as plt# 引入MATLAB相似绘图库,make_classification生成三元分类模型数据


#第一步 读取数据
#先定义下,将数据标签转换为数值
def dianxin_type(s):
    it = {'低压': 0, '正常': 1, '过压': 2}
    return it[s]

dianxin = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin.xls",encoding='utf-8',header =0,converters={5: dianxin_type})#完整数据 header=0去掉了表头

def show_accuracy(y_hat, y_test, param):
    pass
#第二步 数据切片
x = dianxin.iloc[:,1:5]#取数据集的前4列为数据值
y = dianxin.iloc[:,-1]#后1列为数据标签
print("数据\n=",x)
print("数据标签\n=",y)

#第三步 划分训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state = 0,train_size = 0.3)#留出法,每个样本类别分层采样,即低压划分73,正常划分73,过压划分73
#test_size:样本占比,如果是整数的话就是样本的数量
#random_state:是随机数的种子。
#随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
# 比如你每次都填1,其他参数一样的情况下得到的随机数组是一样的。但填0或不填,每次都会不一样。

#第四步 数据预处理,这里用的归一化
Normalizer().fit_transform(x_train)
Normalizer().fit_transform(x_test)
#标准化处理
#StandardScaler().fit_transform(x_train)
#StandardScaler().fit_transform(x_test)#将数据按其属性(按列进行)减去其均值,然后除以其方差,最后得到的结果是,对每个属性/每列来说所有数据都聚集在0附近,方差值为1。

print("训练集=\n",x_train)
print("测试集=\n",x_test)

#第5步,线性核函数配置支持向量机svr
linear_svc = svm.SVC(C=0.8, kernel = "linear",gamma=20)
#训练模型(用训练集将svr模型训练好)
linear_svc.fit(x_train,y_train)
#放入测试集后,预测测试结果
linear_svc_y_predict = linear_svc.predict(x_test)#y_hat
print("\n预测测试结果=",linear_svc_y_predict)


print("\n训练集精度:",linear_svc.score(x_train, y_train))   # 精度,socre函数评分
y_hat = linear_svc.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print("\n测试集精度:",linear_svc.score(x_test, y_test))
y_hat = linear_svc.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')


#也可以用多项式、rbf配置核函数
#poly_svr = SVR(kernel="poly") #多项式配置
#rbf_svr = SVR(kernel="rbf")   #rbf配置

#第6步 训练模型保存

joblib.dump(linear_svc, "dianxin_model_SVC.m")
#第7步 调用训练模型
clf = joblib.load("dianxin_model_SVC.m")

#第8步 用模型进行新数据分类
dianxin_new = pd.read_excel("F:\数据处理\数据\电芯数据\dianxin_new.xls",encoding='utf-8',header =0)
dianxin_new = dianxin_new.sample(frac=1)#由于新数据是实际策略出来的 有点规律 这里将它打乱

def show_accuracy_new(y_hat_new, y_test_new, param):
    pass
#第9步 新数据分类
test_x = dianxin_new.iloc[:,1:5]#取数据集的前4列为数据值

print("新数据\n=",test_x)

test_y = clf.predict(test_x)#新数据经模型训练得到新标签分类
print("新数据电芯状态=\n",test_y)

test_x['电芯状态'] = test_y
print("新数据分类成功=\n",test_x)
plt.plot(test_y)
plt.legend(['0:low_Ubat,1:average,2:high_Ubat'])
plt.show()
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值