学习笔记,仅供参考!
介绍
Scikit-learn(以前称为scikits.learn,也称为sklearn)是一款免费的机器学习库 。它具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度提升,k均值和DBSCAN,本文利用sklearn的RandomForestRegressor模型对无线电电磁波场强做数据预测。
数据集
给出如下图数据示例,这是一个在不同经纬度下的无线电场强数据,X,Y表示经纬度,在这么一个物理地址上去发射88M的无线电电磁波,88000khz表示无线电电磁波,再从原地做一个接收,发现场强衰减了65.9khz,衰减表示可能被周边环境的值所吸收,现在根据已有的数据集,来对不同的场强做预测。
代码
完整代码在最后,这里对各行代码进行注释,便于理解。
1.由于给出的数据集的x,y值存在相同的情况,需要先对相同的x,y数据进行求和再娶均值,利用pandas里面封装的groupby函数和mean函数进行同类数据求和再取均值:
#读入数据
data_prime = pd.read_csv('FieldIntensity.csv', header=0)
data_group = data_prime.groupby(by=['x', 'y'])
data_mean = data_group.mean()
data = data_mean.reset_index()
2.将经纬度数据作为输入x,场强作为输出y,这里选择对93.1M场强来做预测,将数据集随机打乱,再做切分,3/4作为训练集,1/4作为测试集,这里不是一个分类问题,数据有渐变性,用随机森林回归树来训练模型:
RandomForestRegressor函数参数,参考下面地址:
https://wenku.baidu.com/view/edda0dc9fbc75fbfc77da26925c52cc58bd690bf.html
x = data[['x', 'y']]
y = data['93100KHz']
# 切分训练集和测试集,训练集占75%,random_state 相当于随机数种子random.seed() ,其作用是相同的
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.75, random_state=0)
# 随机森林回归决策树,树的个数100,选择节点criterion=mse,mae,数的深度14,每个节点的最少样本数3
model = RandomForestRegressor(n_estimators=100, criterion='squared_error', max_depth=14, min_samples_split=3)
model.fit(x_train.values, y_train)
3.对训练集和测试集做预测,这里先对数据进行了排序,再利用hstack函数对数据在水平方向做堆叠,方便可视化分析结果,易于观看
# 对训练集进行一个排序,目的是使得可视化结果更明白
order = y_train.argsort(axis=0) # argsort函数按index每个数据的下标进行排序
y_train = y_train.values[order]
x_train = x_train.values[order, :]
# 训练预测值
y_train_pred = model.predict(x_train)
# 测试集
order = y_test.argsort(axis=0)
y_test = y_test.values[order]
x_test = x_test.values[order, :]
# 测试预测值
y_test_pred = model.predict(x_test)
# 按水平方向将x_test, y_test,y_test_pred进行堆叠
data = np.hstack((x_test, y_test.reshape(-1, 1), y_test_pred.reshape(-1, 1)))
# 存入DataFrame
data = pd.DataFrame(data