我正在尝试调整使用隐式数据的ALS矩阵分解模型的参数.为此,我正在尝试使用pyspark.ml.tuning.CrossValidator来运行参数网格并选择最佳模型.我相信我的问题在于评估者,但我无法弄明白.
我可以使用回归RMSE评估器为显式数据模型工作,如下所示:
from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
from pyspark.ml.recommendation import ALS
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.sql.functions import rand
conf = SparkConf() \
.setAppName("MovieLensALS") \
.set("spark.executor.memory", "2g")
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)
dfRatings = sqlContext.createDataFrame([(0, 0, 4.0), (0, 1, 2.0), (1, 1, 3.0), (1, 2, 4.0), (2, 1, 1.0), (2, 2, 5.0)],
["user", "item", "rating"])
dfRatingsTest = sqlContext.createDataFrame([(0, 0), (0, 1), (1, 1), (1, 2), (2, …Run Code Online (Sandbox Code Playgroud) 我正在使用 scikit-learn RandomForestRegressor 并为 max_features 设置一个明确的值。当我这样做时,我期望对于森林中的每棵树,在构建树时会考虑长度 max_features 的特征的随机子集(这是正确的还是它是否从整个特征集中执行特征子采样对于每棵树的每个节点?)。我试图找出每棵树使用了哪些功能子集。
这是我现在所处位置的一个示例:
# initialize random forest with 10 trees of depth 2 (max 3 features),
# with 10 randomly subset features selected per tree
rf = RandomForestRegressor(n_estimators=10, max_depth=2, max_features=10)
forest = rf.fit(X,y) # fit the model
# get a list of individual DecisionTreeRegressor objects
trees = forest.estimators_
Run Code Online (Sandbox Code Playgroud)
如果我想找出第一棵树中使用了哪些功能,我想我可以执行以下操作:
[j for j,v in enumerate(trees[0].feature_importances_) if v > 0]
Run Code Online (Sandbox Code Playgroud)
这给了我包含具有非零特征重要性的特征的列的位置。但是,这只给出了决策树从 10 个子采样特征中选择的(最多)3 个特征。据我所知, feature_importances_ 属性不区分已使用但未选择的功能与根本未使用的功能。
我一直在查看源代码,但似乎无法找到整个功能集的子采样在DecisionTreeRegressor定义或_tree定义中发生的位置。
任何帮助将非常感激。
更新
当我阅读源代码时,我相信 splitter …
python machine-learning random-forest scikit-learn data-science