Приведенный выше термин говорит, что дефект прогнозируется на основе сообщения об ошибке из данных приложения.
Постановка задачи
Каждый месяц данные о приложениях резко увеличиваются, многие разработчики и старшие руководители будут бороться, и кажется, что их трудно предсказать вручную, передав сообщение об ошибке. Основная часть защиты такого типа проблем предсказывает, является ли данное сообщение об ошибке истинным или ложным.
Бизнес-цели и ограничения
Минимизируйте ручной эффект разработчиков, чтобы классифицировать его как дефект
Некоторая интерпретируемость.
Проблема машинного обучения
Данные, которые мы берем из 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)
Случайный лес
Случайный лес — это управляемый алгоритм машинного обучения, которыйшироко используется в задачах классификации и регрессии.
- Выберите случайные выборки из заданного набора данных.
- Постройте дерево решений для каждой выборки и получите результат прогноза из каждого дерева решений.
- Выполните голосование за каждый прогнозируемый результат.
- Выберите результат прогноза с наибольшим количеством голосов в качестве окончательного прогноза.
#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))
Вышеупомянутая модель сбрасывается в файлы рассола, которые будут использоваться для прогнозирования дефекта.