簡體   English   中英

什么最適合這個模型?

[英]What will be the best fit for this model?

我有一個Books數據集,我正在嘗試為其選擇最合適的數據集。 我嘗試過LinearRegressionDecisiontreePolynomial one,但它們似乎都不適合曲線。 我繪制了 3 條不同的曲線,一個特征與 y_target 對比,以下是這些曲線:

Curve_1 :評級數量與書籍評級

在此處輸入圖片說明

Curve_2 :文本評論數量與書籍評分在此處輸入圖片說明

Curve_3 :一本書的頁數與書的評分在此處輸入圖片說明

所以請告訴我什么是這種類型曲線的最佳模型,或者我應該通過任何其他方式進行分析? 線性回歸輸出為:

MSE : 0.11599130999215618

MAE : 0.23

准確度:0.11599130999215622

R2 分數:0.08296506346310017

我認為對數會很好,但它可能會留下一些數據(數據接近每條曲線的值 5)。 我對機器學習很陌生,所以請至少指導我一點。

這是數據集鏈接: https : //www.kaggle.com/jealousleopard/goodreadsbooks

數據集快速查看:

在此處輸入圖片說明

這是代碼:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error
import matplotlib.pyplot as plt

from sklearn.tree import DecisionTreeRegressor
from sklearn.preprocessing import PolynomialFeatures

from scipy import stats

df = pd.read_csv("books.csv")

def drop_numerical_outliers(df, z_thresh=3):
    # Constrains will contain `True` or `False` depending on if it is a value below the threshold.
    constrains = df.select_dtypes(include=[np.number]) \
        .apply(lambda x: np.abs(stats.zscore(x)) < z_thresh, reduce=False) \
        .all(axis=1)
    # Drop (inplace) values set to be rejected
    df.drop(df.index[~constrains], inplace=True)

df.drop(['bookID','Unnamed: 10','isbn13','isbn','title','authors'], axis=1, inplace=True)
print(df.columns.values)

print("Shape After dropping columns: ",df.shape)
df.replace(to_replace = 'None', value = '0', inplace=True)

df = df[df['# num_pages'] != '0']   
print("Shape After Removing Rows with Num_pages 0: ",df.shape)

drop_numerical_outliers(df)
#print(df['# num_pages'].values[339])
print("Shape After Removing outliers: ",df.shape)

dummy_cols = ['language_code']
df = pd.get_dummies(df, columns=dummy_cols)
print("Shape After Categorizing dataset: ",df.shape)

#df[(np.abs(stats.zscore(df)) < 3).all(axis=1)] 


x = df[df.columns.values]
x.drop(['average_rating'], axis=1, inplace=True)
y = df['average_rating']

x = x.apply(pd.to_numeric, errors='coerce')
y = y.apply(pd.to_numeric, errors='coerce')

x.fillna(0, inplace=True)
y.fillna(0, inplace=True)

#print(repr(df['# num_pages']))

#x = StandardScaler().fit_transform(x)
#print(df.head())

plt.scatter(x['# num_pages'],y, color = 'blue')
plt.xlabel("Number of Pages per Book")
plt.ylabel("Ratings")
plt.show()

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=4)

regr = LinearRegression()

#regr = DecisionTreeRegressor(random_state=0 )
regr.fit(x_train, y_train)

y_hat = regr.predict(x_test)
print(y_hat)
print(y_test.values)

print("MSE: ", mean_squared_error(y_test, y_hat))
print("Mean absolute error: %.2f" %np.mean(np.absolute(y_hat - y_test)))
print("Accuarcy: ", np.mean((y_hat - y_test)**2))
print('R2 score: ', r2_score(y_test, y_hat))

首先,在機器學習中,你真的必須注意你選擇用於訓練的特征。 在您的示例中,“每本書的頁數”並不能真正幫助您,因為如果一本書很好,讀者就不會關心頁數。 Curve_3 進一步鞏固了這一事實,其中等級 3 和 5 之間的數據非常密集。因此您實際上並不需要此功能。

回到你的問題,你試圖預測一本書的評分。 曲線 1 和 2 中的圖顯示一條曲線無法通過所有點(如果通過,它將是一個過度擬合的模型)。 在這種情況下,線性回歸將在接近 4(在 y 軸上)的值處創建一條直線,因為這是大多數樣本所在的位置。

如果您使用不同程度的多項式回歸,它將為您提供該順序的曲線,但仍然無法像您想要的那樣通過所有點,在您的情況下,這甚至沒有必要。

現在重要的是評估指標。 你的 MAE 非常低,這表明你的模型可以做出很好的預測(低 MAE 好結果,高 MAE 壞結果)。 但是你的 r2 只有 0.082。 r2 介於 0 和 1 之間,1 是完美的預測(可能顯示過度擬合),0 表示非常糟糕的模型和糟糕的預測。 0.082 的值表明在某些測試值中,預測與目標相差甚遠。 因此,總結一下結果,您的模型可以為您提供高精度的預測,但有時它會偏離目標。

在這種情況下,我的建議是收集更多相關特征,然后如果您想要更好的模型,則使用神經網絡訓練您的模型。

我現在已經分析了這個數據集,這里有幾件事我想提一下。

首先,我在 y_test 和 y_hat 之間繪制了一個圖(僅用於線性回歸的預測值): y_test 和 y_hat 之間的繪圖

正如我之前解釋過的,線性回歸將在值 4 附近創建一條直線,您可以看到所有預測都靠近該線。 正因為如此,它會為真實評分為 0 或 5 的值產生高預測誤差。這就是為什么你的 r2_score 如此低的原因,這個低分數意味着你的特征對這個模型來說不夠好。

如果您訪問此筆記本: https : //www.kaggle.com/bellali/select-which-book-to-enjoy,您會發現這些特征與您的目標(書籍評分)之間沒有相關性或相關性非常低。 此外,我還運行了不同的算法,結果很差或非常相似,這進一步證實了這些特征無法解釋您的目標的事實。

這里要提到的另一件事是,該數據集僅用於探索目的,而不用於進行預測。 您可以看到這些數據的幾個內核正在執行不同類型的分析,這就是該數據集的真正目的。

這是“模型與數據一樣好”的典型例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM