gpt4 book ai didi

machine-learning - 什么最适合这个模型?

转载 作者:行者123 更新时间:2023-11-30 08:42:14 25 4
gpt4 key购买 nike

我有一个图书数据集,我正在尝试为其选择最适合的数据集。我尝试过使用线性回归、决策树和多项式,但它们似乎都不适合曲线。我绘制了 3 条不同的曲线,其中一条是特征与 y_target 的关系,以下是图:

Curve_1:评分数量与图书评分

enter image description here

Curve_2:文本评论数量与图书评级 enter image description here

Curve_3:书籍页数与书籍评级 enter image description here

所以请告诉我这种类型曲线的最佳模型是什么,或者我应该通过任何其他方式进行分析?线性回归输出为:

MSE:0.11599130999215618

MAE:0.23

准确度:0.11599130999215622

R2 分数:0.08296506346310017

我认为对数会很好,但它可能会留下一些数据(接近每条曲线的值 5 的数据)。我对机器学习非常陌生,所以请至少指导我一下。

这是数据集链接:https://www.kaggle.com/jealousleopard/goodreadsbooks

数据集快速查看:

enter image description here

代码如下:

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 之间绘制了一个图表(仅用于线性回归的预测值):plot between y_test and y_hat

正如我之前所解释的,线性回归将在值 4 附近创建一条直线,您可以看到所有预测都位于该线附近。因此,它会对真实评分为 0 或 5 的值产生较高的预测误差。这就是您的 r2_score 如此低的原因,而这个低分意味着您的特征对于该模型来说不够好。

如果您转到此笔记本: https://www.kaggle.com/bellali/select-which-book-to-enjoy您会发现这些功能与您的目标(图书评级)之间没有相关性或相关性非常低。此外,我还运行了不同的算法,但结果很差或非常相似,这进一步证实了这些功能无法解释您的目标的事实。

这里要提到的另一件事是,该数据集仅用于探索目的,而不是用于进行预测。您可以看到该数据的几个内核正在进行不同类型的分析,这就是该数据集的真正目的。

这是“模型与数据一样好”的典型示例。

关于machine-learning - 什么最适合这个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57106040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com