Scott's Blog

学则不固, 知则不惑

0%

机器学习:处理Jira工单的分类问题

如何根据jira工单的category自动找到处理它的组呢?这是一个利用机器学习中knn算法的小实践.

算法

我们使用knn分类算法,knn是广为使用的一种机器学习算法,应用于各种应用,如金融、医疗保健、政治学、手写字识别、图像识别与视频识别。

在信用评级中,金融机构用来预测客户的信用评级。在贷款支付机构中,银行来预测贷款是否安全。在政治中,它被用来预测潜在选名是否会投票。

简单介绍下knn:

knn是non-parametric算法,即无假设的意思,它不会对基础数据的分布做任何假设,即不会根据数据集来确定模型结构。

这很有用,因为在现实世界中,很多的数据集是不遵从数学理论的假设的。

同时knn是lazy algorithm算法,即它不需要在模型建立前做大量的数据训练工作。

数据

我们已经把一些数据保存到了jira数据库,现在将它们的分类与所属组拿出来:

1
2
3
sql = select category,assign_group from issues limit 10000
db = pymysql.connect('db_host','db_username','db_pwd','db')
df = pd.read_sql(sql,con=db)

现在数据已经保存到了df中。

A basic Exapple

单个features

1
2
3
4
5
6
7
8
9
10
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
category_encoded = le.fit_transform(df.category)
reporter_encoded = le.fit_transform(reporter)
features = list(zip(category_encoded,reporter_encoded))
label = le.fit(df.assign_group)

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(features,label)
knn.predict([[0,2]])

多个features

另外一种方式,x是我们的category,y则是所属组。

1
2
3
4
5
6
7
8
9
10
from sklearn.neighbors import KNeighborsClassifier 

x_df = df.category
x_train = pd.get_dummies(x_df)

y_df = df.assign_group
y_train = y_df.values

knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(x_train,y_train)

随后你可以直接将x_train传给knn做个预测,然后跟真实的数据做个对比。

拿训练的数据来做预测是不可取的,你必须给模型一些它从来没有看见过的数据预测,这样才能准确的测试模型的性能

你也可以自己生成一些数据来查看,如你已经知道get_dummies后的df有144列,那么你可以自行生成一个2d的dummie数组传给knn.predit.

1
2
3
4
arr_list = np.concatenate(np.zeros((1,143)))
temp_arr = arr_list.tolist()
temp_arr.insert(44,1)
new_x = [temp_arr.insert]
1
output: array(['Helpdesk CN'])

分割数据并查看得分

下面演示了将数据拆分成train,和test后的预测分数:

1
2
3
4
5
6
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)

knn= KNeighborsClassifier(n_neighbors=6)
knn.fit(X_train,y_train)

knn.score(X_test,y_test)
1
output:0.781

78%,这个模型效果还是不错的!

选择Neighbors

我们知道对于knn算法,其中一个关键的参数是neighbors,那么对于不同的neighbors,我们的accuracy的分数是什么样的呢?我们可以来画个图检测一下:

可以看到neighbors在6-7之间,accuracy是最高的,在2-5之间,test的得分竟然比训练数据都要高。

使用knn的优缺点

  • knn算法对于处理非线性数据很有用,可以用它一起处理回归问题
  • knn的测试阶段较慢且耗资源,需要很多的内存来保存来预测的整个数据集
  • 强烈建议将数据进行同比例的标准化,比如将所有数据缩放到0,1的区间内
  • knn不适合太高维度的数据,在那种情况下,需要将维度降低
  • 处理缺失值有助于改善模型的准确度

问题

1. knn fit其中的x,x一定只能是get_dummies算出来的数据吗?

不是,比如 iris 的数据摘要,X的数据是各个部分的长、宽:

1
2
[[5.1,3.5,1.4,0.2],
[4.9,3,1.4,0.2]]

2. knn fit其中的y,y可以是原始数据类型吗?如a,b,a,c

可以,如 datacamp 题目中的政党数据,y=df['party']:

1
2
3
4
5
6
7
8
9
10
11
Out[8]: 
0 republican
1 republican
2 democrat
3 democrat
4 democrat
5 democrat
6 democrat
7 republican
8 republican
9 democrat