荐 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_svr = SVR(kernel = "linear")
#训练模型(用训练集将svr模型训练好)
linear_svr.fit(x_train,y_train)
#预测测试结果
linear_svr_y_predict = linear_svr.predict(x_test)#y_hat
print("\n训练集精度:",linear_svr.score(x_train, y_train)) # 精度
y_hat = linear_svr.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print("\n测试集精度:",linear_svr.score(x_test, y_test))
y_hat = linear_svr.predict(x_test)
show_accuracy(y_hat, y_test, '测试集')
打印如下:
#第六步,模型训练好了,当然要保存模型了(保存在.py文件的同一目录下),留着下次调用
#第6步 训练模型保存
joblib.dump(linear_svr, "dianxin_model_SVR.m")
#第7步,调用训练模型,这里是在同一py文件里调用
#第7步 调用训练模型
clf = joblib.load("dianxin_model_SVR.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 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
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)
#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步,线性核函数配置支持向量机svr
linear_svr = SVR(kernel = "linear")
#训练模型(用训练集将svr模型训练好)
linear_svr.fit(x_train,y_train)
#预测测试结果
linear_svr_y_predict = linear_svr.predict(x_test)#y_hat
print("\n训练集精度:",linear_svr.score(x_train, y_train)) # 精度
y_hat = linear_svr.predict(x_train)
show_accuracy(y_hat, y_train, '训练集')
print("\n测试集精度:",linear_svr.score(x_test, y_test))
y_hat = linear_svr.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_svr, "dianxin_model_SVR.m")
#第7步 调用训练模型
clf = joblib.load("dianxin_model_SVR.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()
本文地址:https://blog.csdn.net/weixin_45776027/article/details/107325707
上一篇: 解读模拟摇杆原理及实验
下一篇: STL空间配置器__2018.08.07