项目描述
现在想用机器学习中的有监督学习算法来识别采购异常单价,但是问题是缺少打标签的数据。因此,首先,使用统计学(3sigma以及箱线图)的方法分别得到异常单项,取这两种方法的交集,然后按采购人汇总,发现数据还是很多,故取交集中的前10%的数据,得到异常数据。
打标签
- Top10%的采购人,到3sigma(或箱线图)异常表中获取这些采购人下的所有异常单项,视为error=1的,放入表格data_false;
- 在原始表格中删去error=1的这些数据,那么得到的就是正常的数据了,放入data_true.
- 注意 这里如果使用循环遍历就比较麻烦了。我使用的办法是将异常的那张表格数据(data_false)加入到原始表格中,然后删除重复的数据,注意调一下参数,重复的均删除.
- 具体实现:
import xlrd
import numpy as np
import pandas as pd
import math
df = pd.read_excel('total.xlsx',error_bad_lines=False) #原始数据
df1 = pd.read_excel('top10.xls')
top10 = df1['采购人'].unique() #全国的数据
for i in range(len(top10)):
top_name = top10[i]
df2 = df[df['采购人'] == top10[i]]
df2['error'] =1
df2.to_csv("test0909.csv",mode = 'a',header=False,encoding="utf_8_sig") #追加写入,不写入表头,header=False
print("已读取到第%d个异常值" %i)
print("写入完毕")
df3 = pd.read_csv('test0909.csv',error_bad_lines=False) #有25列 维度不一样
df4 = df3[['城市','入库单号','采购人','入库时间','仓库','productskuid','产品名称','规格id','品牌','类目组','一级类目','采购金额','件数','小单位数量','小单位单价','入库裸价','省份']] #选取指定的列
df4.to_csv("test0909_error_17columns.csv",mode = 'a',encoding="utf_8_sig" )
df5=df.append(df4)
df5.drop_duplicates(keep=False,inplace=True) #drop_duplicates当中的参数keep=False,意为重复项全部删除,它还有keep="first"与keep="last",分别对应在有多项重复时,保留第一项(或最后一项)
df3.reset_index()
- 再重复一下:drop_duplicates当中的参数keep=False,意为重复项全部删除,它还有keep="first"与keep=“last”,分别对应在有多项重复时,保留第一项(或最后一项)
logistic实现
- 正负样本比例1:1(25000:24831);训练集、测试集比例7:3。
- 选取了三个维度:规格id;小单位数量;入库裸价进行logistic回归
#logistic
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import numpy as np
file= open("data_3dimension_0910_100000.csv",'r', encoding='UTF-8')
data = np.loadtxt(file, skiprows=(1),delimiter=',')
x, y = np.split(data, (4,), axis=1)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.7)
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)
#x_combined_std = np.vstack((x_train_std, x_test_std))
#y_combined = np.hstack((y_train, y_test))
classifier = LogisticRegression(C = 100,solver='newton-cg', random_state=0)
classifier.fit(x_train_std, y_train.ravel())
#yPredict=c.predict(x_test_std)
print("训练集的准确率:",classifier.score(x_train_std, y_train)) # 训练集的准确率
print("测试集的准确率:",classifier.score(x_test_std, y_test)) # 测试集的准确率