首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何训练多变量ML模型?

如何训练多变量ML模型?
EN

Data Science用户
提问于 2018-10-01 21:48:23
回答 2查看 18K关注 0票数 8

这些天我正在努力学习机器学习的概念。我知道在传统的ML数据中,我们会有特性和标签。我脑海中有一些玩具数据,其中有“units_sold”和“num_employees”这样的特性,还有一个标签“_$”。我想要培训的模式,学习这些特点,并为一个特定的“城市”和“商店”标签。例如,如果我执行线性回归,模型将学习城市的截距和系数,并将其存储。当我输入明年的units_sold和num_employees时,我得到了预测。

代码语言:javascript
运行
复制
city        store   units_sold  num_employees   cost_$
New York    A       10          4               11000
New York    B       12          4               11890
New York    C       14          5               15260
New York    D       17          6               17340
London      A       23          5               22770
London      B       27          6               25650
London      C       22          3               21450
Paris       A       4           2               5200
Paris       B       7           3               9590

我正试着集思广益,想知道如何解决这个问题?

EN

回答 2

Data Science用户

回答已采纳

发布于 2018-10-02 03:53:31

这是非常少的数据,所以做很多它是非常困难的。特别是考虑到你期望得到“明年”的估计,而没有任何历史数据作为依据。

但是,如果您希望能够根据您的输入特性(城市、商店、units_sold和num_employees )来估算成本,那么这个问题的设置在机器学习中是非常标准的。

首先,我会把你的数据放入一个熊猫DataFrame,我会用数值对你的分类特征进行编码。我这样做是随机的,但我认为你可以得到更好的结果,通过获得商店的纬度和经度,以及一些有关邻里的数据(密度、财富等)。

代码语言:javascript
运行
复制
import pandas as pd

data = {'city': ['New York', 'New York', 'New York', 'New York', 'London', 'London', 'London', 'Paris', 'Paris'],
        'store': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'A', 'B'],
        'units_sold': [10, 12, 14, 17, 23, 27, 22, 4, 7],
        'num_employees': [4,4,5,6,5,6,3,2,3],
        'cost': [11000, 11890, 15260, 17340, 22770, 25650, 21450, 5200, 9560]}

df = pd.DataFrame(data)

df['store'] =df['store'].astype('category').cat.codes
df['city'] =df['city'].astype('category').cat.codes

当我处理非常少的数据时,我总是喜欢用一些可视化的方法来给我一些关于数据的直觉。让我们首先看看这些特性是如何相互关联的。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt

plt.matshow(df.corr())
plt.xticks(np.arange(5), df.columns, rotation=90)
plt.yticks(np.arange(5), df.columns, rotation=0)
plt.colorbar()
plt.show()

我们可以看到,成本与units_sold直接相关。我想这并不是什么意外。但它也与num_employees相关,与城市呈极强的负相关。

如果我们绘制num_employees和units_sold,我们可以更清楚地看到上面所观察到的相关性。

A预测模型

现在,我们希望能够给出一个模型,我们的投入,并得到一个成本的估计。

让我们先把我们的数据放到一个培训和测试集中。对于如此小的数据集来说,这是非常有问题的,因为您很有可能得到一个省略城市或商店类型的培训集。这将极大地影响模型预测其从未见过的数据输出的能力。

数据的标签是成本。

代码语言:javascript
运行
复制
import numpy as np
from sklearn.model_selection import train_test_split

X = np.asarray(df[['city', 'num_employees', 'store', 'units_sold']])
Y = np.asarray(df['cost'])

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, shuffle= True)

让我们从标准线性回归开始

从sklearn.linear_model导入LinearRegression

代码语言:javascript
运行
复制
from sklearn.linear_model import LinearRegression

lineReg = LinearRegression()
lineReg.fit(X_train, y_train)
print('Score: ', lineReg.score(X_test, y_test))
print('Weights: ', lineReg.coef_)

plt.plot(lineReg.predict(X_test))
plt.plot(y_test)
plt.show()

得分: 0.963554136721权重:

一个更好的选择是使用岭回归。

代码语言:javascript
运行
复制
from sklearn import linear_model
reg = linear_model.Ridge (alpha = .5)
reg.fit(X_train, y_train)
print('Score: ', reg.score(X_test, y_test))
print('Weights: ', reg.coef_)

plt.plot(reg.predict(X_test))
plt.plot(y_test)
plt.show()

得分: 0.971197683706权重:

如果您进行另一次拆分并重新运行这两个模型,您将看到由于数据有限,它们的性能差别很大。然而,简单线性回归的效果要明显得多。

为了更好地了解实际结果,让我们做一些有点顽皮的事情。我们将一次又一次地对数据进行分割,得到不同的模型,并得到它们的平均分数。

代码语言:javascript
运行
复制
scores = []
coefs = []
for i in range(1000):
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, shuffle= True)
    lineReg = LinearRegression()
    lineReg.fit(X_train, y_train)
    scores.append(lineReg.score(X_test, y_test))
    coefs.append(lineReg.coef_)
print('Linear Regression')
print(np.mean(scores))
print(np.mean(coefs, axis=0))

scores = []
coefs = []
for i in range(1000):
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, shuffle= True)
    lineReg = linear_model.Ridge (alpha = .5)
    lineReg.fit(X_train, y_train)
    scores.append(lineReg.score(X_test, y_test))
    coefs.append(lineReg.coef_)
print('\nRidge Regression')
print(np.mean(scores))
print(np.mean(coefs, axis=0))

线性回归-1.43683760609岭回归0.900877146134

我们可以看到,在1000次试验中,脊线回归是最优的模型。

现在,您可以使用该模型来估算成本,方法是将具有与dataset相同顺序的特征的向量传递给模型,如下所示

代码语言:javascript
运行
复制
reg.predict([[2,  4,  1,  12]])

得到的分数是

数组()

这些数据不足以可靠地进行任何机器学习回归。然而,您可以了解哪些因素对您的成本影响最大。

票数 9
EN

Data Science用户

发布于 2021-05-22 02:29:02

你特别提到线性回归。为此,我们可以使用像PySpark VectorAssembler这样的工具从几个列中创建一个向量。

例如,对于要传递给线性回归的几个列CRIM、ZN、INDUS等,您可以创建如下所示的新数据。

代码语言:javascript
运行
复制
from pyspark.ml.feature import VectorAssembler
vectorAssembler = VectorAssembler(inputCols = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PT', 'B', 'LSTAT'], outputCol = 'features')
vhouse_df = vectorAssembler.transform(house_df)
vhouse_df = vhouse_df.select(['features', 'label'])
vhouse_df.show(3)
票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/39034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档