Python实现孤立森林(IForest)+SVR的组合预测模型

只讨论性能,不考虑关联性,降噪数据未填补。

1.引入数据集

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import explained_variance_score
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import time

from sklearn import metrics

import csv

data=[]
traffic_feature=[]
traffic_target=[]
csv_file = csv.reader(open('turang.csv'))
for content in csv_file:
    content=list(map(float,content))
    if len(content)!=0:
        data.append(content)
        traffic_feature.append(content[0:4])
        traffic_target.append(content[-1])

data=np.array(data)

traffic_feature=np.array(traffic_feature)
traffic_target=np.array(traffic_target)

df=pd.DataFrame(data=data,columns = ['土壤温度','空气湿度','空气温度','光照强度','土壤水分'])
df
土壤温度空气湿度空气温度光照强度土壤水分
037.7727.0039.9068150.999.88
137.8028.8340.0363989.969.85
237.8226.8240.2063039.889.78
337.9624.3339.9062988.959.77
437.7724.0339.6059670.049.80
..................
307828.5791.1717.23861.4728.30
307928.5290.9017.17861.5528.30
308028.5089.8017.15861.7628.28
308128.4986.7017.27861.9828.27
308228.4684.5017.43860.3228.28

3083 rows × 5 columns

2.标准化

scaler = StandardScaler() # 标准化转换
scaler.fit(traffic_feature)  # 训练标准化对象
traffic_feature= scaler.transform(traffic_feature)   # 转换数据集
feature_train,feature_test,target_train, target_test = train_test_split(traffic_feature,traffic_target,test_size=0.1,random_state=10)

3.SVR

from sklearn.svm import SVR
import matplotlib.pyplot as plt  
start1=time.time()
model_svr = SVR(C=1,epsilon=0.1,gamma=10)
model_svr.fit(feature_train,target_train)
predict_results1=model_svr.predict(feature_test)
end1=time.time()

SVRRESULT=predict_results1

plt.plot(target_test)#测试数组
plt.plot(predict_results1)#测试数组
plt.legend(['True','SVR'])
fig = plt.gcf()
fig.set_size_inches(18.5, 10.5)
plt.title("SVR")  # 标题
plt.show()
print("EVS:",explained_variance_score(target_test,predict_results1))
print("R2:",metrics.r2_score(target_test,predict_results1))
print("Time:",end1-start1)

EVS: 0.6563954626493961
R2: 0.6536622059850858
Time: 0.3603041172027588

4.引入IForest降噪

from sklearn.ensemble import IsolationForest

model_isof = IsolationForest()
outlier_label = model_isof.fit_predict(df)
# 将array 类型的标签数据转成 DataFrame
outlier_pd = pd.DataFrame(outlier_label, columns=['outlier_label'])
# 将标签数据与原来的数据合并
data_merge = pd.concat((df, outlier_pd), axis=1)
normal_source = data_merge[data_merge['outlier_label']==1]
normal_source

 5.测试效果

IF_traffic_feature=normal_source.values[:,[0,1,2,3]]
IF_traffic_target=normal_source.values[:,[4]]
scaler.fit(IF_traffic_feature)  # 训练标准化对象
IF_traffic_feature= scaler.transform(IF_traffic_feature)   # 转换数据集
feature_train,feature_test,target_train, target_test = train_test_split(IF_traffic_feature,IF_traffic_target,test_size=0.1,random_state=10)
from sklearn.svm import SVR
import matplotlib.pyplot as plt  
start1=time.time()
model_svr = SVR(C=1,epsilon=0.1,gamma=10)
model_svr.fit(feature_train,target_train)
predict_results1=model_svr.predict(feature_test)
end1=time.time()


plt.plot(target_test)#测试数组
plt.plot(predict_results1)#测试数组
plt.legend(['True','SVR'])
fig = plt.gcf()
fig.set_size_inches(18.5, 10.5)
plt.title("SVR")  # 标题
plt.show()
print("EVS:",explained_variance_score(target_test,predict_results1))
print("R2:",metrics.r2_score(target_test,predict_results1))
print("Time:",end1-start1)

EVS: 0.5487895968648998
R2: 0.5255880566754088
Time: 0.2094569206237793

效果不怎么样...可能是数据集或者未数据填补的原因。

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 使用Python来写拓展iForest,可以使用Scikit-Learn库中的IsolationForest类,这是一个用来检测异常值的机器学习算法。可以使用这个类训练一个模型来做异常值检测,并调整参数以获得更好的性能。 ### 回答2: 使用Python编写extend iforest可以通过以下步骤完成。 首先,我们需要导入所需的Python库,如NumPy、Pandas和Scikit-learn等,以便进行数据处理和模型构建。 接下来,我们可以创建一个名为ExtendIForest的类,该类继承自Scikit-learn库中的BaseEstimator和TransformerMixin类。这两个类提供了一些基础的方法和属性,使我们的类能够符合Scikit-learn的Transformer接口。 在ExtendIForest类中,我们可以定义fit()和transform()方法来训练和应用模型。 在fit()方法中,我们可以实现ExtendIForest算法的训练过程。这个过程包括调用Scikit-learn库中的IsolationForest类来拟合数据,获得基本iForest模型。然后,我们可以进一步修改这个基本模型,使其变为ExtendIForest。具体修改的方式可以根据算法论文提供的扩展iforest的方法来实现。 在transform()方法中,我们可以使用训练好的ExtendIForest模型来对新的数据进行异常值标记。这个过程可以与IsolationForest中的predict()方法类似,但可能需要根据ExtendIForest算法论文提供的扩展方法进行一些调整。 最后,我们可以在ExtendIForest类的构造函数中设置需要的参数,如样本量、扩展方法的参数等。 通过以上步骤,我们就可以使用Python编写ExtendIForest的基本框架。具体的算法细节和实现方式可以根据你所选择使用的ExtendIForest算法来进一步调整和完善。 ### 回答3: 如果要用Python编写extend iforest,首先需要了解iforest机器学习算法的基本原理和实现方式。iforest是一种集成学习方法,它通过构建一棵或多棵孤立的决策树来识别异常数据。 为了扩展iforest算法,可以考虑以下几个方面: 1. 数据准备:根据iforest的原理,需要将数据转换为合适的格式,通常为二维数组,其中每一行代表一个样本,每一列代表一个特征。确保数据集中不存在缺失值。 2. 树的构建:使用Python编写函数来构建决策树。可以采用递归的方式,在每个节点上选择一个适当的分割特征和阈值,将样本分为左子树和右子树。 3. 孤立树的集成:可以构建多棵孤立树,并将它们组合成一个模型。可以采用循环的方式,每次构建一棵新的孤立树,并将其添加到模型中。 4. 异常值判断:在使用模型进行异常值判断时,需要通过计算样本在每棵树上的路径长度。路径长度越短的样本越有可能是异常值。 5. 参数调整:通过调整一些参数,比如树的个数、分割特征的选择策略等,可以进一步改进模型的性能。可以使用交叉验证等方法来寻找最佳参数。 最后,可以将以上的代码组织成一个Python包或者类,使其更方便地在其他程序中引用和使用。通过这样的方式,我们就可以用Python实现extend iforest算法,用于异常值检测和数据分析等任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值