这些天我正在努力学习机器学习的概念。我知道在传统的ML数据中,我们会有特性和标签。我脑海中有一些玩具数据,其中有“units_sold”和“num_employees”这样的特性,还有一个标签“_$”。我想要培训的模式,学习这些特点,并为一个特定的“城市”和“商店”标签。例如,如果我执行线性回归,模型将学习城市的截距和系数,并将其存储。当我输入明年的units_sold和num_employees时,我得到了预测。
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我正试着集思广益,想知道如何解决这个问题?
发布于 2018-10-02 03:53:31
这是非常少的数据,所以做很多它是非常困难的。特别是考虑到你期望得到“明年”的估计,而没有任何历史数据作为依据。
但是,如果您希望能够根据您的输入特性(城市、商店、units_sold和num_employees )来估算成本,那么这个问题的设置在机器学习中是非常标准的。
首先,我会把你的数据放入一个熊猫DataFrame,我会用数值对你的分类特征进行编码。我这样做是随机的,但我认为你可以得到更好的结果,通过获得商店的纬度和经度,以及一些有关邻里的数据(密度、财富等)。
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当我处理非常少的数据时,我总是喜欢用一些可视化的方法来给我一些关于数据的直觉。让我们首先看看这些特性是如何相互关联的。
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,我们可以更清楚地看到上面所观察到的相关性。

现在,我们希望能够给出一个模型,我们的投入,并得到一个成本的估计。
让我们先把我们的数据放到一个培训和测试集中。对于如此小的数据集来说,这是非常有问题的,因为您很有可能得到一个省略城市或商店类型的培训集。这将极大地影响模型预测其从未见过的数据输出的能力。
数据的标签是成本。
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
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权重:

一个更好的选择是使用岭回归。
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权重:

如果您进行另一次拆分并重新运行这两个模型,您将看到由于数据有限,它们的性能差别很大。然而,简单线性回归的效果要明显得多。
为了更好地了解实际结果,让我们做一些有点顽皮的事情。我们将一次又一次地对数据进行分割,得到不同的模型,并得到它们的平均分数。
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相同顺序的特征的向量传递给模型,如下所示
reg.predict([[2, 4, 1, 12]])得到的分数是
数组()
这些数据不足以可靠地进行任何机器学习回归。然而,您可以了解哪些因素对您的成本影响最大。
发布于 2021-05-22 02:29:02
你特别提到线性回归。为此,我们可以使用像PySpark VectorAssembler这样的工具从几个列中创建一个向量。
例如,对于要传递给线性回归的几个列CRIM、ZN、INDUS等,您可以创建如下所示的新数据。
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)https://datascience.stackexchange.com/questions/39034
复制相似问题