本文使用sklearn实现相关功能,knn和kmean具体细节在文章末尾。
knn分类方案
样本集取得与预处理
样本集数据取得
通过 pd.read_excel("a.xlsx", sheet_names=xxxx) 方法对excel文件中对应订单信息的表单的数据或者 pd.read_csv('nba.csv').to_string() 方法对csv文件进行预处理(获得两个维度,品类和数量),得到样本集的DataFrame格式。如下方代码所示:
X = read_data_frame('赛题数据.xlsx')
样本集数据清洗
去除空值
使用DataFrame中的dropna方法将存在空值的样本进行去掉
相关参数(来着runoob):
- axis:默认为0,表示逢空值剔除整行,如果设置参数axis=1表示逢空值去掉整列。
- how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
- thresh:设置需要多少非空值的数据才可以保留下来的。
- subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
- inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据而非给出一个新的DataFrame
# 假定一下列
column = ['产品代码', '数量(件)']
data_frame = pd.read_excel(file, sheet_name='客户订单', usecols=column)
df_drop = data_frame.dropna()
标准化
使用sklearn.preprocessing中的 StandardScaler 进行标准化数据,以防止某数据过于出头。
scaler = StandardScaler()
训练与测试
训练集与测试集分开
使用sklearn.model_selection模块中的train_test_split(X, Y, test_size=0.3, random_state=42)将样本集的70%划归训练集,30%划归测试集,以42为随机种子确保结果一致。
X作为特征矩阵中的数据,Y作为标签标记数据,一共占据2x2个变量。当样本量过少的时候不必分割。
X_train, X_test, Y_train, Y_test = train_test_split(X_scaler, test_size=0.3)
训练
使用sklearn.neighbors模块中的KNeighborsClassifier()方法确定模型参数(默认找5个临近样本),用KNeighborsClassifier().fit(xxx1 ,yyy1) 确定训练集(这里占据了2x2中的2x1变量)。
model = KNeighborsClassifier()
X_scaler = scaler.fit_transform(X_train)
Y_scaler = scaler.fit_transform(Y_train)
model.fit(X_scaler, Y_scaler)
prediction = model.fit_predict(Y_test, Y_test)
测试
使用KNeighborsClassifier.predict(xxx2, yyy2)进行测试
prediction = model.fit_predict(Y_test, Y_test)
保存数据
joblib.dump(跑模型时的变量, '文件名.joblib')
使用joblib.load('文件名.joblib')加载模型
scaler =joblib.load('scaler.joblib')
joblib.dump(model, 'model.joblib')
kmean聚类
样本集取得与预处理
样本集数据取得
通过pd.read_excel("a.xlsx", sheet_names=xxxx) 方法对excel文件中对应订单信息的表单的数据或者pd.read_csv('nba.csv')方法对csv文件进行预处理(获得两个维度,品类和数量),得到样本集的DataFrame格式。pd.read_csv().to_string()用来在print里面输出完整
X = read_data_frame('赛题数据.xlsx')
样本集数据清洗
去除空值
使用DataFrame中的dropna方法将存在空值的样本进行去掉
相关参数(来着runoob):
- axis:默认为0,表示逢空值剔除整行,如果设置参数axis=1表示逢空值去掉整列。
- how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
- thresh:设置需要多少非空值的数据才可以保留下来的。
- subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
- inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据而非给出一个新的DataFrame。
# 假定一下列
column = ['产品代码', '数量(件)']
data_frame = pd.read_excel(file, sheet_name='客户订单', usecols=column)
df_drop = data_frame.dropna()
样本合并
DataFrame.groupby('品类').sum() 将每种品类的订单量进行求和
多重函数可以表示为 df.groupby('品类').agg([func1, func2]) func有sum(), mean(), count(), min(), max(), std()
column = ['产品代码', '数量(件)']
data_frame = pd.read_excel(file, sheet_name='客户订单', usecols=column)
df_drop = data_frame.dropna()
df_drop.groupby('产品代码').sum()
标准化
使用sklearn.preprocessing中的 StandardScaler 进行标准化数据,以防止某数据过于出头。
scaler = StandardScaler()
训练与测试
训练集与测试集分开
使用sklearn.model_selection模块中的train_test_split(X, test_size=0.3, random_state=42)将样本集的70%划归训练集,30%划归测试集,以42为随机种子确保结果一致。
X_train作为特征矩阵中的数据,X_test作为标签标记数据,一共占据1x2个变量。
X_train, X_test = train_test_split(X_scaler, test_size=0.3)
训练
使用sklearn.cluster模块中的KMeans()方法确定模型参数,用KMeans().fit(xxx1) 确定训练集(这里占据了1x2中的1x1变量)。
model = KMeans(n_clusters=3)
model.fit(X_train)
测试
KMeans.predict(xxx2)(这里占据了另一个变量 即为测试集)
model.fit_predict(X_test)
保存数据
joblib.dump(跑模型时的变量, '文件名.joblib')
使用joblib.load('文件名.joblib')加载模型
scaler =joblib.load('scaler.joblib')
joblib.dump(model, 'model.joblib')
完整代码
import pandas as pd
import os
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.cluster import AgglomerativeClustering
from sklearn.cluster import SpectralClustering
from sklearn.preprocessing import LabelEncoder
import joblib
def read_data_frame(file):
column = ['产品代码', '数量(件)']
data_frame = pd.read_excel(file, sheet_name='客户订单', usecols=column)
df_drop = data_frame.dropna()
return df_drop.groupby('产品代码').sum()
def run_sklearn(X, X_scaler):
# 标签编码
#label = np.array(['low', 'medium', 'high'])
#Y = encoder.fit_transform(label)
# 分割样本集
#X_train, X_test = train_test_split(X_scaler, test_size=0.3) #量太小啦
#model = KMeans(n_clusters=3)
model = AgglomerativeClustering(n_clusters=3)
#model = SpectralClustering(n_clusters=3, assign_labels='kmeans')
model.fit(X_scaler)
#model.fit(X_train)
#prediction = model.fit_predict(X_test)
joblib.dump(model, 'model.joblib')
#print(str(prediction))
all_prediction = model.fit_predict(X_scaler)
frequency = {0: 'low', 2: 'medium', 1: 'heigh'}
result = pd.DataFrame({'产品代码': X.index, '数量': X.iloc[:, 0].values, '频次': all_prediction})
result['频次'] = result['频次'].map(frequency)
print(result)
return result
def main():
X = read_data_frame('赛题数据.xlsx')
if os.path.isfile('scaler.joblib') == True:
scaler =joblib.load('scaler.joblib')
else:
#标准化
scaler = StandardScaler()
X_scaler = scaler.fit_transform(X)
joblib.dump(scaler, 'scaler.joblib')
if os.path.isfile('model.joblib') == True:
model = joblib.load('model.joblib')
all_prediction = model.fit_predict(X_scaler)
result = pd.DataFrame({'产品代码': X.index, '数量': X.iloc[:, 0].values, '频次': all_prediction})
frequency = {0: 'low', 2: 'medium', 1: 'heigh'}
result['频次'] = result['频次'].map(frequency)
print(result)
return result
else:
run_sklearn(X, X_scaler)
if name == "main":
main()
Comments NOTHING