- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个图书数据集,我正在尝试为其选择最适合的数据集。我尝试过使用线性回归、决策树和多项式,但它们似乎都不适合曲线。我绘制了 3 条不同的曲线,其中一条是特征与 y_target 的关系,以下是图:
Curve_1:评分数量与图书评分
所以请告诉我这种类型曲线的最佳模型是什么,或者我应该通过任何其他方式进行分析?线性回归输出为:
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 之间绘制了一个图表(仅用于线性回归的预测值):
正如我之前所解释的,线性回归将在值 4 附近创建一条直线,您可以看到所有预测都位于该线附近。因此,它会对真实评分为 0 或 5 的值产生较高的预测误差。这就是您的 r2_score 如此低的原因,而这个低分意味着您的特征对于该模型来说不够好。
如果您转到此笔记本: https://www.kaggle.com/bellali/select-which-book-to-enjoy您会发现这些功能与您的目标(图书评级)之间没有相关性或相关性非常低。此外,我还运行了不同的算法,但结果很差或非常相似,这进一步证实了这些功能无法解释您的目标的事实。
这里要提到的另一件事是,该数据集仅用于探索目的,而不是用于进行预测。您可以看到该数据的几个内核正在进行不同类型的分析,这就是该数据集的真正目的。
这是“模型与数据一样好”的典型示例。
关于machine-learning - 什么最适合这个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57106040/
我正在制作一个简单的程序来更改我的计算机背景。我在网上发现了一个stackoverflow问题,或多或少涵盖了我想做的事情。我现在可以成功地将我的墙纸更改为平铺、居中和从在线图像 URL 拉伸(str
是的,这是另一个每组最大的问题之一!我已经尝试了几天,试图解决这个问题,但无济于事。我也一直在寻找,但我什至不知道我是否在正确的地方寻找。问题的最简化版本如下。 我有 2 个表,一个是多对多表,另一个
我想解析一些数据,我有一个 BNF 语法来解析它。谁能推荐任何能够生成可在移动设备上使用的代码的语法编译器? 由于这是针对 JavaME 的,因此生成的代码必须是: 希望很小 对外来 Java 库的依
我有一个动物园时间序列对象,vels : 2011-05-01 00:00:00 7.52 2011-05-01 00:10:00 7.69 2011-05-01 00:20:00 7.67 2011
我想创建一个供小型制造公司使用的生产管理系统。该系统将允许记录设备制造的不同阶段。要求如下: 1.非基于浏览器的界面。需要基于 Swing 或 AWT 的东西。虽然我了解实现基于浏览器的解决方案的便利
是否有任何 java 或 clojure 邮件库可以实现 lamson 的功能?特别是lamson的邮件路由功能非常酷http://verpa.wordpress.com/2010/11/13/mak
sklearn 中的 fit() 方法似乎在同一界面中服务于不同的目的。 应用于训练集时,像这样: model.fit(X_train, y_train) fit() 用于学习稍后将在测试集上使用 p
我使用 OSM 显示县的边界。它在大多数情况下工作得很好,但在某些情况下,县更大并且不适合 map 。 如何在开始渲染之前调整缩放级别? var map = L.map("mapCnty").setV
我正在致力于缩小和丑化我的 javascript 文件。我想知道合适的尺寸是多大。如果我将所有js文件合并成一个文件(经过缩小和丑化),它会大于1mb。我想,最好将它们分成 2-3 个文件(每个文件
我是 Java 新手。 我想在 GridPane 中放置一个 TextArea。我在过去几个小时内尝试了此操作,结果如下: 如您所见,TextArea 比我的 Gridpane 大得多。这是我的代码:
sklearn 中的 fit() 方法似乎在同一界面中服务于不同的目的。 应用于训练集时,像这样: model.fit(X_train, y_train) fit() 用于学习稍后将在测试集上使用 p
我认为这是一个基本问题,但也许我混淆了这些概念。 假设我使用 R forecast 包中的函数 auto.arima() 将 ARIMA 模型拟合到时间序列。该模型假设方差不变。我如何获得该方差?是残
我使用 OSM 显示县的边界。它在大多数情况下工作得很好,但在某些情况下,县更大并且不适合 map 。 如何在开始渲染之前调整缩放级别? var map = L.map("mapCnty").setV
我有一个很长的标签,这是我的第一个标签,我想把它放在我的单元格中。这就是我所拥有的,但它不起作用。 我有一个自定义的 UITabelviewCell ,里面有几个标签。 -(CGFloat)table
假设我有一个包含 WCS header 的 FITS 文件,这样我就可以执行以下操作: #import healpy as hp #import astropy.io.fits as pyfits #
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭10 年前。 Improve
我们正在构建一个与其他系统有多个集成接触点的应用程序。我们有效地使用 Unity 来满足我们所有的依赖注入(inject)需求。整个业务层是用接口(interface)驱动的方法构建的,实际实现在应用
我得到了 MKMapView 和一些注释。我使用下一个代码来显示所有注释: NSArray *coordinates = [self.mapView valueForKeyPath:@"annotat
我在一家托管公司工作,我们经常收到安装、新域、滞后修复等方面的请求。为了大致了解仍然开放的内容,我决定制作一个非常简单的票务系统。我有一点 php 知识和一点 MySQL 知识。目前,我们将根据客户的
我想向我的 UITableView 添加背景图像,它适合 UI,还具有导航 Controller 和工具栏。在那种情况下,我没有找到适合 iPhone 和 iPad 不同屏幕的 tableview 的
我是一名优秀的程序员,十分优秀!