Приведенный выше термин говорит, что дефект прогнозируется на основе сообщения об ошибке из данных приложения.

Постановка задачи

Каждый месяц данные о приложениях резко увеличиваются, многие разработчики и старшие руководители будут бороться, и кажется, что их трудно предсказать вручную, передав сообщение об ошибке. Основная часть защиты такого типа проблем предсказывает, является ли данное сообщение об ошибке истинным или ложным.

Бизнес-цели и ограничения

Минимизируйте ручной эффект разработчиков, чтобы классифицировать его как дефект

Некоторая интерпретируемость.

Проблема машинного обучения

Данные, которые мы берем из jira, для конкретных приложений имеют разные значения.

У нас будут разные данные, такие как идентификатор, описание, сводка, разрешение и название.

Сопоставление проблемы реального мира с проблемой машинного обучения

Для заданных данных пользователю необходимо предсказать статус дефекта, и это кажется простой проблемой классификации.

Метрика производительности

Точность

Загрузка данных

Взятие данных из Jira и анализ ключей и значений там, чтобы получить основные функции, которые помогут предсказать

url = "https://ctl.atlassian.net/rest/api/2/search?jql=issuetype = bug and Team=3678&maxResults=1&startAt=0"
x = requests.get(url, headers=headers)
y=x.json()
type(y)
y
# Creating Dataframe and fetching to that df dataframe
df = pd.DataFrame()
for i in range(0,y['total']):
url = "https://ctl.atlassian.net/rest/api/2/search?jql=issuetype = bug and Team=3678&maxResults=1&startAt=%s" % i
x = requests.get(url, headers=headers)
df = df.append(json_normalize(x.json()['issues']),ignore_index=True)
#New dataframe df2 which has primary feature that helps us to predict 
df2 = pd.DataFrame()
df2['key']=df['key']
df2['description']=df['fields.description']
df2['summary']=df['fields.summary']
df2['status']=df['fields.status.name']
df2['isdefect']=df['fields.resolution.name']
print(df2)

Предварительная обработка данных

Предварительная обработка данных является неотъемлемым этапом машинного обучения, поскольку качество данных и полезная информация, которую можно извлечь из них, напрямую влияют на способность нашей модели к обучению; поэтому чрезвычайно важно, чтобы мы предварительно обработали наши данные, прежде чем вводить их в нашу модель.

#Filling the description with summary if it is null
for i in range(0,len(df2)):
    if df2['description'].isnull()[i]==True:
       df2['description'][i]=df2['summary'][i]
print(df2)

Принимая разрешение в качестве основного признака, мы классифицируем дефект

df2['defect']='nan'
for i in range(0,len(df2)):
   if df2['isdefect'][i]=='Defect':
      df2['defect'][i]='True'
   elif df2['isdefect'][i]=='Test Data Error':
      df2['defect'][i]='False'
   elif df2['isdefect'][i]=='Invalid Test Scenario':
      df2['defect'][i]='False'
   elif df2['isdefect'][i]=='Fixed':
      df2['defect'][i]='True'
   elif df2['isdefect'][i]=='nan':
      df2['defect'][i]='False'
   elif df2['isdefect'][i]=='Not a Bug':
      df2['defect'][i]='False'
   elif df2['isdefect'][i]=="Won't Do":
      df2['defect'][i]='False'
   elif df2['isdefect'][i]=='Cannot Reproduce':
      df2['defect'][i]='False'
   elif df2['isdefect'][i]=='Declined':
      df2['defect'][i]='False'
   else:
      df2['defect'][i]='False'

Понижение текста, удаление спецсимволов и пробелов

df2.description=df2.description.str.lower()
df2.description = df2.description.str.replace(r"[^a-zA-Z\d\_]+", " ")
df2.description=df2.description.str.replace('\d+', '')

Удаление стоп-слов

df2['without_stopwords'] = df2['description'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))

Векторизатор TF-IDF

частота слов, присутствующих в корпусе, но также обеспечивает важность слов.

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
txt_to_fts = vec.fit_transform(df2['without_stopwords']).toarray()
txt_to_fts.shape
c = 'description'
txt_fts_names = [c + f'word{i}_count' for i in range(txt_to_fts.shape[1])]
df2[txt_fts_names] = txt_to_fts

Кодировщик ярлыков

LabelEncoder используется для нормализации меток. Его также можно использовать для преобразования нечисловых меток в числовые метки. Закодируйте целевые метки со значением от 0 до n_classes-1.

# Import LabelEncoder
from sklearn import preprocessing
#creating labelEncoder
le = preprocessing.LabelEncoder()
# Converting string labels into numbers.status_encoded=le.fit_transform(df2['defect'])
y=status_encoded
X=df2.iloc[:, 7:]

Поезд-тест разлит

import sklearn
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=42)
print('Training Data Shape',X_train.shape)
print('Test Data Shape',X_test.shape)

Случайный лес

Случайный лес — это управляемый алгоритм машинного обучения, которыйшироко используется в задачах классификации и регрессии.

  1. Выберите случайные выборки из заданного набора данных.
  2. Постройте дерево решений для каждой выборки и получите результат прогноза из каждого дерева решений.
  3. Выполните голосование за каждый прогнозируемый результат.
  4. Выберите результат прогноза с наибольшим количеством голосов в качестве окончательного прогноза.
#Import Random Forest Model
from sklearn.ensemble import RandomForestClassifier
#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)
#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)

Показатель

#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy, how often is the classifier correct?print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Вышеупомянутая модель сбрасывается в файлы рассола, которые будут использоваться для прогнозирования дефекта.