在使用 python 和 pandas 进行机器学习建模之前,我如何转换描述符均值居中并缩放为单位方差
how can i transformed descriptors mean centered and scaled to unit variance prior to Machine learning modeling using python and pandas
如何使用 pandas 或 numpy 或任何适当的 python 模块将给定数据集转换为均值中心并缩放为单位方差,数据还包含一些缺失值 "Nan" 在建模任务请求帮助之前也应该删除。
感谢
例如。数据集。
GA_ID PN_ID PC_ID MBP_ID GR_ID AP_ID class
0.033 6.652 6.681 0.194 0.874 3.177 0
0.034 9.039 6.224 0.194 1.137 Nan 0
0.035 10.936 10.304 1.015 0.911 4.9 1
0.022 10.11 9.603 1.374 0.848 4.566 1
0.035 2.963 17.156 0.599 0.823 9.406 1
0.033 10.872 10.244 1.015 0.574 4.871 1
0.035 21.694 22.389 1.015 0.859 9.259 1
0.035 10.936 10.304 1.015 0.911 Nan 1
0.035 10.936 10.304 1.015 0.911 4.9 1
0.035 10.936 10.304 1.015 0.911 4.9 0
0.036 1.373 12.034 0.35 0.259 5.723 0
0.033 9.831 9.338 0.35 0.919 4.44 0
我用过:
from sklearn import preprocessing
import numpy as np
raw_data = open("/home/zebrafish/Desktop/scklearn/data.csv")
dataset = np.loadtxt(raw_data, delimiter=",")
X = dataset[:,0:5]
y = dataset[:,6]
X_pro = preprocessing.scale(X)
但我不确定这种方法是否最新,或者它会忽略 "Nan" 还是会自动为 "Nan" 采取适当的步骤,因为在原始数据中没有 "Nan" 值,但为了了解解决方案(如果出现),我在两个位置手动合并了 "Nan"。
谢谢
Question Update
通过谷歌搜索和研究数据,我可能发现这种方法可以基于行对数据进行规范化,而我想对基于列的数据进行规范化。
那么什么是列基归一化的合适方法。
感谢
正如您已经开始的那样,一个简单的方法是通过 sklearn 的预处理库
您可以从删除 NaN 值开始:
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='Nan', strategy='mean', axis=1)
cleaned_X = imp.fit_transform(X)
在这种情况下,您的 'Nan' 值将替换为该列中其余值的平均值 (AP_ID),而不是完全删除行(并丢失数据)。
接下来,为了按列归一化你的数据,你的方法其实是正确的:
scaled_X = preprocessing.scale(cleaned_X)
默认情况下,sklearn 将按特征(列)规范化您的变量;要按样本(行)归一化,您可以将 'axis = 1' 添加到 scale 函数的参数中。但是,请怀疑您是否愿意这样做。
供参考:
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html
值得注意的一点是,如果您稍后的统计分析(比如线性回归或您有什么)需要假设特征之间没有显着相关性,并且您注意到特征之间有很多相关性 - 缩放每列独立是不够的(preprocessing.scale 会自动完成)。
如果确实如此,我建议首先使用 sklearn 的 PCA 分解和 'whiten = True'。这将有效地将数据缩放到单位方差和零均值,同时消除特征之间的线性相关性(通过投影到解释数据的大部分可变性的正交方向)。
希望这对您有所帮助!
如何使用 pandas 或 numpy 或任何适当的 python 模块将给定数据集转换为均值中心并缩放为单位方差,数据还包含一些缺失值 "Nan" 在建模任务请求帮助之前也应该删除。
感谢
例如。数据集。
GA_ID PN_ID PC_ID MBP_ID GR_ID AP_ID class
0.033 6.652 6.681 0.194 0.874 3.177 0
0.034 9.039 6.224 0.194 1.137 Nan 0
0.035 10.936 10.304 1.015 0.911 4.9 1
0.022 10.11 9.603 1.374 0.848 4.566 1
0.035 2.963 17.156 0.599 0.823 9.406 1
0.033 10.872 10.244 1.015 0.574 4.871 1
0.035 21.694 22.389 1.015 0.859 9.259 1
0.035 10.936 10.304 1.015 0.911 Nan 1
0.035 10.936 10.304 1.015 0.911 4.9 1
0.035 10.936 10.304 1.015 0.911 4.9 0
0.036 1.373 12.034 0.35 0.259 5.723 0
0.033 9.831 9.338 0.35 0.919 4.44 0
我用过:
from sklearn import preprocessing
import numpy as np
raw_data = open("/home/zebrafish/Desktop/scklearn/data.csv")
dataset = np.loadtxt(raw_data, delimiter=",")
X = dataset[:,0:5]
y = dataset[:,6]
X_pro = preprocessing.scale(X)
但我不确定这种方法是否最新,或者它会忽略 "Nan" 还是会自动为 "Nan" 采取适当的步骤,因为在原始数据中没有 "Nan" 值,但为了了解解决方案(如果出现),我在两个位置手动合并了 "Nan"。
谢谢
Question Update
通过谷歌搜索和研究数据,我可能发现这种方法可以基于行对数据进行规范化,而我想对基于列的数据进行规范化。
那么什么是列基归一化的合适方法。
感谢
正如您已经开始的那样,一个简单的方法是通过 sklearn 的预处理库
您可以从删除 NaN 值开始:
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='Nan', strategy='mean', axis=1)
cleaned_X = imp.fit_transform(X)
在这种情况下,您的 'Nan' 值将替换为该列中其余值的平均值 (AP_ID),而不是完全删除行(并丢失数据)。
接下来,为了按列归一化你的数据,你的方法其实是正确的:
scaled_X = preprocessing.scale(cleaned_X)
默认情况下,sklearn 将按特征(列)规范化您的变量;要按样本(行)归一化,您可以将 'axis = 1' 添加到 scale 函数的参数中。但是,请怀疑您是否愿意这样做。
供参考: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html
值得注意的一点是,如果您稍后的统计分析(比如线性回归或您有什么)需要假设特征之间没有显着相关性,并且您注意到特征之间有很多相关性 - 缩放每列独立是不够的(preprocessing.scale 会自动完成)。
如果确实如此,我建议首先使用 sklearn 的 PCA 分解和 'whiten = True'。这将有效地将数据缩放到单位方差和零均值,同时消除特征之间的线性相关性(通过投影到解释数据的大部分可变性的正交方向)。
希望这对您有所帮助!