有没有办法让 Scikit-learn Imputer 查找并替换多个被视为“缺失值”的值?
\n例如,我想做类似的事情
\nimp = Imputer(missing_values=(7,8,9))\n
Run Code Online (Sandbox Code Playgroud)\n但根据文档,missing_values参数只接受单个整数:
\n\n\nMissing_values :整数或 \xe2\x80\x9cNaN\xe2\x80\x9d,可选(默认=\xe2\x80\x9dNaN\xe2\x80\x9d)
\n缺失值的占位符。所有出现的丢失值都将被估算。对于编码为 np.nan 的缺失值,请使用字符串值 \xe2\x80\x9cNaN\xe2\x80\x9d。
\n
Python 包Fancyimpute提供了几种方法来估算 Python 中的缺失值。该文档提供了以下示例:
# X is the complete data matrix
# X_incomplete has the same values as X except a subset have been replace with NaN
# Model each feature with missing values as a function of other features, and
# use that estimate for imputation.
X_filled_ii = IterativeImputer().fit_transform(X_incomplete)
Run Code Online (Sandbox Code Playgroud)
当将插补方法应用于数据集时,这很有效X
。但是如果需要training/test
拆分呢?一次
X_train_filled = IterativeImputer().fit_transform(X_train_incomplete)
Run Code Online (Sandbox Code Playgroud)
被调用,我如何估算测试集并创建X_test_filled
?测试集需要使用来自训练集的信息进行估算。我想IterativeImputer()
应该返回和对象可以适合X_test_incomplete
。那可能吗?
请注意,对整个数据集进行插补然后拆分为训练和测试集是不正确的。
我有一个包含缺失值的数据矩阵,我正在尝试估算这些值,我正在查看不同估算器的选项,并检查哪些设置最适合我正在工作的生物环境。我了解 knnimpute 函数matlab 和 scikit-learn 中的简单输入器。但是,我不太确定我对迭代插补器的理解是否正确。
我已经查看了该站点上的多变量/迭代插补器的文档 - https://scikit-learn.org/stable/modules/generated/sklearn.impute.IterativeImputer.html
我不明白算法的解释,作为循环。插补者是否使用矩阵中列和行的特征来确定缺失数据点的“值”?然后采用这种方法一次一个随机丢失的数据点,以避免将数据不自然地转向先前估算的数据点的特征?
我有一个半稀疏的矩阵。所有单元格中有一半是空白(na),所以当我尝试运行“鼠标”时,它将尝试对所有单元格起作用。我只对一个子集感兴趣。
问题:在下面的代码中,如何使“小鼠”仅在前两列上运行?有没有一种干净的方法使用行滞后或行前导来做到这一点,以便上一行的内容可以帮助修补当前行中的孔?
set.seed(1)
#domain
x <- seq(from=0,to=10,length.out=1000)
#ranges
y <- sin(x) +sin(x/2) + rnorm(n = length(x))
y2 <- sin(x) +sin(x/2) + rnorm(n = length(x))
#kill 50% of cells
idx_na1 <- sample(x=1:length(x),size = length(x)/2)
y[idx_na1] <- NA
#kill more cells
idx_na2 <- sample(x=1:length(x),size = length(x)/2)
y2[idx_na2] <- NA
#assemble base data
my_data <- data.frame(x,y,y2)
#make the rest of the data
for (i in 3:50){
my_data[,i] <- rnorm(n = length(x))
idx_na2 <- sample(x=1:length(x),size = length(x)/2)
my_data[idx_na2,i] <- NA
}
#imputation
est <- …
Run Code Online (Sandbox Code Playgroud) 我正在尝试imputeTS
包中的功能。该包提供了多个函数来估算单变量时间序列数据中的缺失值。我测试了它们,除了功能之外,它们都很棒na_kalman
。此函数更改原始数值向量。下面是一个例子。
# Load packages
library(imputeTS)
# Set seeds
set.seed(123)
# Generate 10 random number
dat <- rnorm(10)
# Replace the first 10 numbers to be NA
dat[1:5] <- NA
# Check the numbers in dat
dat
[1] NA NA NA NA NA 1.7150650 0.4609162 -1.2650612 -0.6868529
[10] -0.4456620
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我创建了一个包含 10 个数字的向量,而前 5 个数字是NA
。
# Apply the na_kalman function
dat2 <- na_kalman(dat)
# Check the numbers in dat2
dat2
[1] 1.7150650 1.7150650 1.7150650 1.7150650 1.7150650 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试对中等大小的数据框(~100,000 行)进行插补,其中 30 列中有 5 列具有 NA(很大比例,大约 60%)。
我用以下代码尝试了鼠标:
library(mice)
data_3 = complete(mice(data_2))
Run Code Online (Sandbox Code Playgroud)
第一次迭代后,我得到以下异常:
iter imp variable
1 1 Existing_EMI Loan_Amount Loan_Period
Error in solve.default(xtx + diag(pen)): system is computationally singular: reciprocal condition number = 1.08007e-16
Run Code Online (Sandbox Code Playgroud)
是否有其他一些更适合这种情况的软件包?我该如何处理这个问题?
作为R初学者,我发现很难弄清楚如何计算多重估算数据的描述性统计数据(比运行一些其他基本分析更重要,例如关联和回归).
这些类型的问题以道歉(Descriptive statistics(Means,StdDevs)使用多重推算数据:R)开头,但尚未得到解答(https://stats.stackexchange.com/questions/296193/pooling-basic-descriptives-从几个乘法推算数据集 - 使用 - 鼠标)或迅速投下一票.
以下是对mouseadds函数的描述(https://www.rdocumentation.org/packages/miceadds/versions/2.10-14/topics/stats0),我发现很难跟踪以mids格式存储的数据.
我已经使用摘要(完整(imp))得到了一些输出,如均值,中位数,最小值,最大值,但是我想知道如何获得额外的汇总输出(例如,偏斜/峰度,标准偏差,方差).
从上面的上一张海报中借来的插图:
> imp <- mice(nhanes, seed = 23109)
iter imp variable
1 1 bmi hyp chl
1 2 bmi hyp chl
1 3 bmi hyp chl
1 4 bmi hyp chl
1 5 bmi hyp chl
2 1 bmi hyp chl
2 2 bmi hyp chl
2 3 bmi hyp chl
> summary(complete(imp))
age bmi hyp chl
1:12 Min. :20.40 1:18 Min. :113
2: 7 …
Run Code Online (Sandbox Code Playgroud) 我想为几组列估算缺失值。这个想法是对于数值变量,我想使用中位数来估算NA
,对于分类变量,我想使用模式来估算NA
. 我确实搜索了如何为不同的列集分别估算它,但没有找到。
我的数据很大,有很多列,所以我把它放在data.table 中。由于我不确定如何在 data.table 中执行此操作,因此我尝试了下面的代码库 R。我尝试了下面的代码,但不知何故,我似乎弄乱了列名标识。
我的数据很大并且有多个变量。我存储载体数值变量var_num,我存储载体分类变量var_chr。
请参阅下面的示例代码 -
library(data.table)
set.seed(1200)
id <- 1:100
bills <- sample(c(1:20,NA),100,replace = T)
nos <- sample(c(1:80,NA),100,replace = T)
stru <- sample(c("A","B","C","D",NA),100,replace = T)
type <- sample(c(1:7,NA),100,replace = T)
value <- sample(c(100:1000,NA),100,replace = T)
df1 <- as.data.table(data.frame(id,bills,nos,stru,type,value))
class(df1)
var_num <- c("bills","nos","value")
var_chr <- c("stru","type")
impute <- function(x){
#print(x)
if(colnames(x) %in% var_num){
x[is.na(x)] = median(x,na.rm = T)
} else if (colnames(x) …
Run Code Online (Sandbox Code Playgroud) 我试图在名为age的单一列上使用Imputer来替换缺少的值。但是,我收到了以下错误:“期望的2D数组,而是获得了1D数组:”
以下是我的代码
import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer
dataset = pd.read_csv("titanic_train.csv")
dataset.drop('Cabin',axis = 1,inplace = True)
x = dataset.drop('Survived',axis = 1)
y = dataset['Survived']
imputer = Imputer(missing_values ="nan",strategy = "mean",axis = 1)
imputer=imputer.fit(x['Age'])
x['Age']=imputer.transform(x['Age'])
Run Code Online (Sandbox Code Playgroud) 我的数据框中有一个NaN
值列表,我想用空字符串替换 NaN 值。
到目前为止我已经尝试过,但不起作用:
df_conbid_N_1 = pd.read_csv("test-2019.csv",dtype=str, sep=';', encoding='utf-8')
df_conbid_N_1['Excep_Test'] = df_conbid_N_1['Excep_Test'].replace("NaN","")
Run Code Online (Sandbox Code Playgroud) 我正在参加泰坦尼克号 Kaggle 比赛,目前正在尝试估算缺失Age
值。
这个想法是计算训练集上每组的Age
平均值,然后使用该信息来替换训练集和测试集。[Pclass, Sex]
NaN
这是我到目前为止所拥有的:
meanAgeTrain = train.groupby(['Pclass', 'Sex'])['Age'].transform('mean')
for df in [train, test]:
df['Age'] = df['Age'].fillna(meanAgeTrain)
Run Code Online (Sandbox Code Playgroud)
问题是,这仍然在测试集中留下了一些 NaN 值,同时消除了训练集中的所有 Nan。我认为这与指数有关。
我需要的是:
如何使用 Pandas 正确完成此操作?
编辑:
感谢您的建议。@Reza 的那个可以工作,但我不能 100% 理解它。所以我正在尝试提出自己的解决方案。
这是可行的,但我是 Pandas 新手,想知道是否有更简单的方法来实现它。
trainMeans = self.train.groupby(['Pclass', 'Sex'])['Age'].mean().reset_index()
def f(x):
if x["Age"] == x["Age"]: # not NaN
return x["Age"]
return trainMeans.loc[(trainMeans["Pclass"] == x["Pclass"]) & (trainMeans["Sex"] == x["Sex"])]["Age"].values[0]
self.train['Age'] = self.train.apply(f, axis=1)
self.test['Age'] = …
Run Code Online (Sandbox Code Playgroud) 我有一个数据集,其中每个缺失值都有 N/A,如何将其更改为列本身内部的实际缺失值。
我一直在尝试使用规则引擎节点,但它不起作用.. 有
什么建议吗?
我正在输入缺失值,missRanger
因为我有 1000 个变量,所以花费的时间太长。我尝试使用并行计算,但它并没有使过程更快。这是代码
library(doParallel)
cores=detectCores()
cl <- makeCluster(cores[1]-1)
registerDoParallel(cl)
library(missRanger)
train[1:lengthvar] <- missRanger(train[1:lengthvar], pmm.k = 3, num.trees = 100)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)
我不确定要向此代码添加什么才能使其正常工作。
imputation ×13
missing-data ×6
python ×6
r ×6
scikit-learn ×4
pandas ×3
r-mice ×3
conceptual ×1
data.table ×1
dataframe ×1
fancyimpute ×1
function ×1
imputets ×1
knime ×1
nan ×1
summary ×1
time-series ×1