最近给公司做电芯状态分类,边搞边学了下数据处理和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)#留出法,每个样本类别分层采样,即低压划分7:3,正常划分7:3,过压划分7:3
#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()