我想创建一个数据集,其中我有从1到10年的工作经验,工资从3万到10万,我希望这些工资是随机的,并遵循这些年的经验有时一个经验丰富的人比经验少的人赚得少。
例如:
years of experience | Salary
1 | 30050
2 | 28500
3 | 36000
...
10 | 100,500
以下是我目前所做的:
import numpy as np
import random
import pandas as pd
years = np.linspace(1.0, 10.0, num=10)
salary = np.linspace(30000.0, 100000.0, num=10) + random.uniform(-1,1)*5000#plus/minus 5k
data = pd.DataFrame({'experience' : years, 'salary': salary})
print (data)
这给了我:
experience salary
0 1.0 31060.903965
1 2.0 38838.681742
2 3.0 46616.459520
3 4.0 54394.237298
4 5.0 62172.015076
5 6.0 69949.792853
6 7.0 77727.570631
7 8.0 85505.348409
8 9.0 93283.126187
9 10.0 101060.903965
我们可以看到,我们没有得到一些记录,一个经验较高的人赚得比经验较低的人少。我该怎么解决?当然,我想把这个缩放到1000行
最佳答案
scikit learn提供了一些有用的函数来生成相关数据,例如make_regression
。
例如,您可以:
import numpy as np
import pandas as pd
from sklearn.datasets import make_regression
np.random.seed(0)
n_samples = 1000
X, y = make_regression(n_samples=n_samples, n_features=1, n_informative=1,
noise=80, random_state=0)
# Scale X (years of experience) to 0..10 range
X = np.interp(X, (X.min(), X.max()), (0, 10))
# Scale y (salary) to 30000..100000 range
y = np.interp(y, (y.min(), y.max()), (30000, 100000))
# To dataframe
df = pd.DataFrame({'experience': X.flatten(), 'salary': y}
print(df.head(10))
从你所描述的情况来看,你似乎想在回应中加入一些变化这可以通过调整
noise
参数来完成。让我们把它设计得更明显些:from matplotlib import pyplot as plt
plt.scatter(X, y, color='blue', marker='.', label='Salary')
plt.xlabel("Years of Experience")
plt.ylabel("Salary")
plt.show()
例如,使用
noise=80
:或使用
noise=250
:顺便说一句:这为“多年的经验”创造了持续的价值。如果希望它们四舍五入为整数,可以使用
X = np.rint(X)