Машинное обучение для альтернативных периодов времени - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть скрипт полиномиальной регрессии, который корректно работает для прогнозирования значений по осям X и Y, в моем примере я использую потребление ЦП, ниже мы видим пример набора данных:

enter image description here

Полный набор данных

Где time представляет время сбора, например:

1 = 1 minute
2 = 2 minute

И т. Д. ...

И consume - это значение использования процессора для этой минуты, суммирование этого набора данных демонстрирует поведение хоста в течение 30 минут, каждое значение соответствует одной минуте в порядке возрастания (1мин, 2мин, 3мин ...)

Результат для этого:

enter image description here

С этим алгоритмом:

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('data.csv')
X = dataset.iloc[:, 1:2].values
y = dataset.iloc[:, 2].values

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Fitting Polynomial Regression to the dataset
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=4)
X_poly = poly_reg.fit_transform(X)
pol_reg = LinearRegression()
pol_reg.fit(X_poly, y)

# Visualizing the Polymonial Regression results
def viz_polymonial():
    plt.scatter(X, y, color='red')
    plt.plot(X, pol_reg.predict(poly_reg.fit_transform(X)), color='blue')
    plt.title('Polynomial Regression for CPU')
    plt.xlabel('Time range')
    plt.ylabel('Consume')
    plt.show()
    return
viz_polymonial()

# 20 = time
print(pol_reg.predict(poly_reg.fit_transform([[20]])))

В чем проблема?

Если мы продублируем этот набор данных так, что 30-минутный диапазон будет отображаться дважды, алгоритм не поймет эти данные набор и его результат не так эффективен, пример набора данных:

enter image description here -> До time = 30 * 1 043 *enter image description here -> До time = 30

Полный набор данных

Примечание: В случае, если он имеет 60 значений, где каждые 30 значений представляют диапазон 30 минут, как если бы они были разными днями сбора.

Результат, который он показывает, таков:

enter image description here

Цель: Мне бы хотелось, чтобы синяя линия, представляющая полиномиальную регрессию, была похожа на первое изображение результата, которое мы видим выше, демонстрирует al oop, где точки связаны, как если бы алгоритм не удался.

Источник исследования

1 Ответ

1 голос
/ 14 апреля 2020

Проблема в том, что во втором случае вы строите график, используя X = 1, 2, ... 30, 1, 2, ... 30. Функция построения графика соединяет последовательные точки. Если вы только что построили график рассеяния с помощью pyplot, вы бы увидели свою хорошую кривую регрессии. Или вы могли бы argsort. Вот код с разбросанным зеленым цветом, строка argsort черным.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression

# Importing the dataset
# dataset = pd.read_csv('data.csv')
dataset = pd.read_csv('data.csv')
X = dataset.iloc[:, 1:2].values
y = dataset.iloc[:, 2].values

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# Fitting Polynomial Regression to the dataset
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=4)
X_poly = poly_reg.fit_transform(X)
pol_reg = LinearRegression()
pol_reg.fit(X_poly, y)

# Visualizing the Polymonial Regression results
def viz_polymonial():
    plt.scatter(X, y, color='red')
    indices = np.argsort(X[:, 0])
    plt.scatter(X, pol_reg.predict(poly_reg.fit_transform(X)), color='green')
    plt.plot(X[indices], pol_reg.predict(poly_reg.fit_transform(X))[indices], color='black')
    plt.title('Polynomial Regression for CPU')
    plt.xlabel('Time range')
    plt.ylabel('Consume')
    plt.show()
    return
viz_polymonial()

# 20 = time
print(pol_reg.predict(poly_reg.fit_transform([[20]])))

Вот выходное изображение для большего набора данных. enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...