我有一个很大但非常稀疏的矩阵(50,000行*100,000列,只有10%的值是已知的).此矩阵的每个已知元素都是从0.00到1.00的浮点数,这些已知值存储在python dict中,格式如下:
{'c1': {'r1':0.27, 'r3':0.45},
'c2': {'r2':0.65, 'r4':0.87} }
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何有效地从这个dict构造一个pandas.DataFrame?这里,效率包括内存使用和构造数据帧的时间.
对于内存使用,我希望通过np.uint8存储每个元素.因为已知值是0.00到1.00而我只关心前2位数,所以我可以通过乘以100将其转换为无符号8位整数.这可能会为此数据帧节省大量内存.
有没有办法做到这一点?
我正在使用sklearn.ensemble.GradientBoostingRegressor来训练模型.
我的数据集包括异构变量,包括数字和类别变量.由于sklearn不支持分类变量,因此在输入到Regressor之前,我使用DictVectorizer转换这些分类特征.这是我的一段代码:
# process numeric and categorical variables separately
lsNumericColumns = []
lsCategoricalColumns = []
for col in dfTrainingSet.columns:
if (dfTrainingSet[col].dtype == np.object):
lsCategoricalColumns.append(col)
else:
lsNumericColumns.append(col)
# numeric columns
dfNumVariables = dfTrainingSet.loc[:, lsNumericColumns]
dfNumVariables.fillna(0, inplace=True)
arrNumVariables = dfNumVariables.as_matrix()
# categorical columns
dfCateVariables = dfTrainingSet.loc[:,lsCategoricalColumns]
dfCateVariables.fillna('NA', inplace=True)
vectorizer = DictVectorizer(sparse=False)
arrCateFeatures = vectorizer.fit_transform(dfCateVariables.T.to_dict().values())
# setup training set
arrX = np.concatenate((arrNumVariables,arrCateFeatures), axis=1)
arrY = dfData['Y'].values
Run Code Online (Sandbox Code Playgroud)
然后,训练模型并输出特征重要性:
# setup regressor
params = {'n_estimators':500, 'max_depth':10, 'min_samples_split':50, \
'min_samples_leaf':50, 'learning_rate':0.05, 'loss':'lad', \
'subsample':1.0, …
Run Code Online (Sandbox Code Playgroud) 假设我有一个这样的系列:
In [19]: sr
Out[19]:
a 1
b 2
c 3
d 4
dtype: int64
In [20]: sr.index
Out[20]: Index([u'a', u'b', u'c', u'd'], dtype='object')
Run Code Online (Sandbox Code Playgroud)
我不想按字典顺序排序,而是根据自定义顺序对此系列进行排序cdab
.我怎样才能做到这一点?
如果是DataFrame会怎样?如何按给定的索引列表对其进行排序?
我已经实现了矩阵分解模型,比如R = U*V,现在我将训练和测试这个模型.
为此,给定一个稀疏矩阵R(缺失值为零),我想先在训练中隐藏一些非零元素,然后将这些非零元素用作测试集.
如何从numpy.ndarray中随机选择一些非零元素?此外,我需要记住这些选定元素的索引和列位置,以便在测试中使用这些元素.
例如:
In [2]: import numpy as np
In [4]: mtr = np.random.rand(10,10)
In [5]: mtr
Out[5]:
array([[ 0.92685787, 0.95496193, 0.76878455, 0.12304856, 0.13804963,
0.30867502, 0.60245974, 0.00797898, 0.1060602 , 0.98277982],
[ 0.88879888, 0.40209901, 0.35274404, 0.73097713, 0.56238248,
0.380625 , 0.16432029, 0.5383006 , 0.0678564 , 0.42875591],
[ 0.42343761, 0.31957986, 0.5991212 , 0.04898903, 0.2908878 ,
0.13160296, 0.26938537, 0.91442668, 0.72827097, 0.4511198 ],
[ 0.63979934, 0.33421621, 0.09218392, 0.71520048, 0.57100522,
0.37205284, 0.59726293, 0.58224992, 0.58690505, 0.4791199 ],
[ 0.35219557, 0.34954002, 0.93837312, 0.2745864 , 0.89569075, …
Run Code Online (Sandbox Code Playgroud)