[Stove AI] Построение регрессорной модели машинного обучения 031-KNN

машинное обучение искусственный интеллект Python NumPy

[Stove AI] Построение регрессорной модели машинного обучения 031-KNN

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)

В предыдущей статье мы научились строить модель классификатора KNN, но KNN можно использовать не только для задач классификации, но и для задач регрессии, В этой главе мы изучим построение и обучение моделей регрессии KNN.


1. Подготовьте набор данных

Здесь мы строим последовательный набор данных, используя случайную функцию, которая генерируется с помощью функции np.sinc() для генерации значений y.

# 准备数据集,此处用随机的方式生成一些样本数据
amplitute=10
num_points=100
dataset_X=amplitute*np.random.rand(num_points,1)-0.5*amplitute
dataset_y=np.sinc(dataset_X).ravel()
dataset_y+=0.2*(0.5-np.random.rand(dataset_y.size))
print(dataset_X.shape)
print(dataset_y.shape)

Нанесите этот набор данных на график с помощью plt, и вы увидите следующие результаты.

数据集的分布情况


2. Построение и обучение регрессионной модели KNN

Создание и обучение регрессора KNN так же просто, как классификатор KNN со следующим кодом.

# 构建KNN回归模型
from sklearn.neighbors import KNeighborsRegressor
K=8
KNN_regressor=KNeighborsRegressor(K,weights='distance')
KNN_regressor.fit(dataset_X,dataset_y)

Хотя регрессор KNN построен и обучен здесь, как узнать результат обучения?

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

# 将回归器绘制到图中
def plot_regressor(regressor, X, y):
    # 将数据集绘制到图表中看看分布情况
    plt.scatter(X,y,color='k',marker='o',label='dataset')
    predicted=regressor.predict(X)
    plt.scatter(dataset_X,predicted,color='blue',marker='*',label='predicted')
    plt.xlim(X.min() - 1, X.max() + 1)
    plt.ylim(y.min() - 0.2, y.max() + 0.2)
    plt.legend()
    plt.show()

Производительность этого набора данных можно увидеть на рисунке ниже:

KNN回归器在训练集上的表现

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

# 下面用本KNN回归器来预测新样本数据,如下
# 构建了10倍的新数据,并且建立第二个轴,用于KNNregressor.predict
new_samples=np.linspace(-0.5*amplitute, 0.5*amplitute, 10*num_points)[:, np.newaxis]
new_predicted=KNN_regressor.predict(new_samples)

# 把原始数据也画上来
plt.scatter(dataset_X,dataset_y,color='k',marker='o',label='dataset')
plt.plot(new_samples,new_predicted,color='r',linestyle='-',
         label='new_samples')
plt.legend()

Полученный график, похоже, имеет очень серьезное переоснащение, как показано ниже:

KNN回归器在新样本数据上的表现

########################резюме########################## ######

1. Построение, обучение и предсказание регрессора KNN в основном такие же, как у классификатора KNN.

2. Я использую регрессор KNN для прогнозирования обучающего набора, и полученное прогнозируемое значение точно такое же, как значение Y в обучающем наборе. Я проверял это много раз, но результат все тот же. Сначала, Я думал, что это вызвано слишком маленьким значением К. Переоснащение, но это все еще происходит после модификации К. Я не знаю, сталкивался ли кто-нибудь еще с этим явлением.Я долго искал и не нашел причину .

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.