我对 Python 比较陌生,正在尝试准备一些数据来训练 RandomForest。由于各种原因,我们希望数据是离散的,所以有几个连续的变量需要离散化。我qcut
在 Pandas 中找到了它,它似乎可以做我想做的事 - 我可以设置多个垃圾箱,它会将变量离散化到那么多垃圾箱中,试图保持每个垃圾箱中的计数均匀。
但是,输出的pandas.qcut
是一个Intervals列表,scikit-learn中的RandomForest分类器需要一个字符串。我发现我可以使用.astype(str)
. 这是我正在做的事情的一个快速示例:
import pandas as pd
from random import sample
vals = sample(range(0,100), 100)
cuts = pd.qcut(vals, q=5)
str_cuts = pd.qcut(vals, q=5).astype(str)
Run Code Online (Sandbox Code Playgroud)
然后 str_cuts 是传入随机森林的变量之一。
但是,该系统的目的是训练 RandomForest,将其保存到文件中,然后允许某人在以后加载它并获得新测试实例的分类,这在训练时是不可用的。并且因为分类器是在离散化数据上训练的,所以新的测试实例需要在使用前进行离散化。所以我希望能够做的是在一个新实例中读取,将已经建立的离散化方案应用于它,将其转换为字符串,然后在随机森林中运行它。但是,我对“应用离散化方案”的最佳方式感到困惑。
有没有简单的方法来处理这个问题?我认为没有直接的方法可以将字符串转换回间隔。我可以从离散化(例如:)中获取所有 Interval 值的列表cuts.unique()
并在测试时应用它,但这需要在随机森林旁边保存/加载离散化字典,这看起来很笨重,我担心会遇到问题试图重新创建一个分类变量(主要来自 R,它对分类变量的格式非常讲究)。或者还有其他我没有看到的解决方法吗?
我的数据包含连续和分类功能的混合.下面是我的数据在csv格式中的一小部分(将其视为由在不同城市运营商店的超级商店链收集的数据)
city,avg_income_in_city,population,square_feet_of_store_area, store_type ,avg_revenue
NY ,54504 , 3506908 ,3006 ,INDOOR , 8000091
CH ,44504 , 2505901 ,4098 ,INDOOR , 4000091
HS ,50134 , 3206911 ,1800 ,KIOSK , 7004567
NY ,54504 , 3506908 ,1000 ,KIOSK , 2000091
Run Code Online (Sandbox Code Playgroud)
她可以看到avg_income_in_city,square_feet_of_store_area和avg_revenue是连续值,其中city,store_type等是分类类(还有一些我没有在这里展示以保持数据的简洁性).
我希望对数据建模以预测收入.问题是如何使用sklearn"离散"连续值?sklearn是否为连续值的离散化提供了任何"现成的"类/方法?(就像我们在Orange中一样,例如Orange.Preprocessor_discretize(data,method = orange.EntropyDiscretization())
谢谢 !
有没有办法根据自定义限制(意味着范围的长度不相等)来离散化 Pandas 数据框中的列?此处提出的先前问题不涵盖此案例。
例如,假设我们想要将数字成绩(满分 4 分)转换为 bin,如下所示:
3.75 至 4:优秀
3.5 至 3.75:非常好
3.25 至 3.5:好
3 至 3.25:平均
2.5 至 3:差
2.5以下:非常差
我知道可以使用一系列if
s 和else
s 来完成,但我一直在寻找一种更干净、更灵活(对于更多数量的垃圾箱)的方法来做到这一点。
在Python中,假设我有连续变量x
和y
,其值在0和1之间是有界的(更容易).我的假设一直是,如果我想将这些变量转换为序数值,其中二进制数为0,0.01,0.02,...,0.98,0.99,1,可以简单地将原始值舍入到第二个数字.出于某种原因,当我这样做时,它留下了文物.
让我来说明问题(但是请注意,我的问题不是如何获得正确的情节,而是实际上如何进行正确的分组).首先,这些是重现问题所需的唯一模块:
import numpy as np
import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)
现在,假设我们连续生成如下所示的数据(其他数据生成过程也会产生同样的问题):
# number of points drawn from Gaussian dists.:
n = 100000
x = np.random.normal(0, 2, n)
y = np.random.normal(4, 5, n)
# normalizing x and y to bound them between 0 and 1
# (it's way easier to illustrate the problem this way)
x = (x - min(x))/(max(x) - min(x))
y = (y - min(y))/(max(y) - min(y))
Run Code Online (Sandbox Code Playgroud)
然后,让我们仅仅通过应用一些舍入来转换x
并y
在上述间隔中进行序数.然后,我们将结果存入一个x
由y …
我试图将连续变量离散化,将其分为三个等级.我想对正连续变量(在这种情况下,收入)的日志做同样的事情.
require(dplyr)
set.seed(3)
mydata = data.frame(realinc = rexp(10000))
summary(mydata)
new = mydata %>%
select(realinc) %>%
mutate(logrealinc = log(realinc),
realincTercile = cut(realinc, 3),
logrealincTercile = cut(logrealinc, 3),
realincTercileNum = as.numeric(realincTercile),
logrealincTercileNum = as.numeric(logrealincTercile))
new[sample(1:nrow(new), 10),]
Run Code Online (Sandbox Code Playgroud)
我原以为使用cut()
会对每个变量(收入和对数收入)的离散因子产生相同的水平,因为log是单调函数.所以这里右边的两列应该是相等的,但这似乎不会发生.这是怎么回事?
> new[sample(1:nrow(new), 10),]
realinc logrealinc realincTercile logrealincTercile realincTercileNum logrealincTercileNum
7931 0.2967813 -1.21475972 (-0.00805,2.83] (-4.43,-1.15] 1 2
9036 0.9511824 -0.05004944 (-0.00805,2.83] (-1.15,2.15] 1 3
8204 4.5365676 1.51217069 (2.83,5.66] (-1.15,2.15] 2 3
3136 2.0610693 0.72322490 (-0.00805,2.83] (-1.15,2.15] 1 3
9708 0.9655805 -0.03502581 (-0.00805,2.83] (-1.15,2.15] 1 …
Run Code Online (Sandbox Code Playgroud) 我正在使用arules包来离散数据框中的连续变量.我正在使用这个特定的行
离散化(data1,categories = 3)
但它给了我一个错误
cut.default(x,k2)中的错误:k2必须是数字
我只是想将我的连续变量从"data1"数据帧转换为3个bin离散变量.任何帮助将不胜感激...提前感谢
我想创建具有离散状态空间但具有浮点值的自定义 openai 健身房环境。更准确地说,它应该是步长为 0.25 的值范围:10.0、10.25、10.5、10.75、11.0、...、19.75、20.0
有没有办法在 openai 健身房自定义环境中使用 Discrete、Box、MultiDiscrete 或其他空间等空间来做到这一点?离散需要一个整数,而 Box 似乎没有某种步骤参数。
当我运行我的代码时,我在我的子例程中收到一条错误消息。
此代码来自 Kincaid & Cheney 的书中关于求解椭圆偏微分方程的 Gauss Seidel 方法的练习。
错误信息是:
在 (1) 处的变量定义上下文(赋值)中带有 INTENT(IN) 的虚拟参数 'u'。
我在下面的代码中参考了(1)。如何修复子例程,以免出现错误消息?
subroutine seidel(ax,ay,nx,ny,h,itmax,u)
real, dimension(0:nx,0:ny), intent(in) :: u
real, intent(in) :: ax,ay, h
integer, intent(in) :: nx, ny, itmax
integer:: i,j,k
do k = 1,itmax
do j = 1,ny-1
y = ay + real(j)*h
do i = 1,nx-1
x = ax + real(i)*h
v = u(i+1,j) + u(i-1,j) + u(i,j+1) + u(i,j-1)
u(i,j) = (v - h*h*g(x,y))/(4.0 - h*h*f(x,y)) (1)
end do
end do …
Run Code Online (Sandbox Code Playgroud) 我有这些数据有两列。正如您在图表中看到的那样,数据有太多噪声。因此,我想离散化大小为5的列“ r”,并将每一行分配给其对应的bin,然后计算每个bin的f的平均值。
> dr
r f
1 65.06919 21.796
2 62.36986 22.836
3 59.81639 22.980
4 57.42822 22.061
5 55.22681 21.012
6 53.23533 21.274
7 51.47815 21.594
8 49.98000 22.117
9 48.76474 20.366
10 47.85394 18.991
11 47.26521 20.920
12 47.01064 20.161
13 47.09565 22.328
14 47.51842 19.610
15 48.27007 18.615
16 49.33559 21.753
17 50.69517 22.754
18 52.32590 22.096
19 54.20332 22.020
20 56.30275 22.111
21 58.60034 21.395
22 61.07373 22.635
23 63.70243 22.128
24 66.46804 21.698
25 62.24147 …
Run Code Online (Sandbox Code Playgroud) python ×4
r ×3
binning ×2
pandas ×2
artifacts ×1
average ×1
dataframe ×1
fortran ×1
matplotlib ×1
openai-gym ×1
rounding ×1
scikit-learn ×1