Numpy特征选择与MRMR
在本文中,我们将介绍使用Numpy的MRMR算法进行特征选择的方法。对于一个数据集,如果特征太多,可能会导致维度灾难,影响模型的效果和性能。因此,通过特征选择,我们可以降低特征数目,提高模型的精度和效率。
阅读更多:Numpy 教程
什么是MRMR算法?
Minimum Redundancy Maximum Relevance (MRMR) 算法是一种基于信息论的特征选择算法,最早由Peng等人提出。其主要思想是,在特征选择过程中,选择具有最高相关性和最小冗余的特征子集。具体来说,MRMR算法首先计算每个特征与类别之间的相关性,然后计算彼此之间特征的相关性。最后,从中选择出具有最高相关性和最小冗余的特征集合。
如何使用Numpy实现MRMR算法?
首先,我们需要将数据集转换为Numpy数组。
import numpy as np
data = np.genfromtxt('dataset.csv', delimiter=',')
其中,’dataset.csv’是我们要选择特征的数据集文件名,delimiter参数用于指定文件的分隔符。
接下来,我们需要将特征和类别分开,并计算特征之间的相关性。
features = data[:,:-1] # 所有特征
labels = data[:,-1] # 所有类别
n_features = features.shape[1] # 特征数量
correlation_matrix = np.zeros((n_features, n_features)) # 保存特征的相关性
for i in range(n_features):
for j in range(i+1, n_features):
# 计算两个特征之间的相关性
corr_ij = np.corrcoef(features[:,i], features[:,j])[0,1]
correlation_matrix[i,j] = corr_ij
correlation_matrix[j,i] = corr_ij # 相关性矩阵是对称的
以上代码中,我们使用了numpy库提供的corrcoef函数计算特征之间的相关性。因为相关性矩阵是对称的,所以我们只需要计算矩阵的右上角部分即可。
计算特征与类别之间的相关性也是类似的。
feature_label_corr = np.zeros(n_features) # 保存特征和类别之间的相关性
for i in range(n_features):
feature_label_corr[i] = np.corrcoef(features[:,i], labels)[0,1]
接下来,我们可以计算特征的互信息和冗余度。
# 计算特征的互信息
def mutual_information(x,y):
pxy, _ = np.histogramdd([x,y], bins=[len(np.unique(x)),len(np.unique(y))])
pxy = pxy / float(np.sum(pxy))
px = np.sum(pxy, axis=1)
py = np.sum(pxy, axis=0)
px_py = np.outer(px, py)
px_py[px_py == 0] = 1
mi = np.sum(pxy * np.log2(pxy / px_py))
return mi
# 计算每个特征的冗余度
redundancy = np.zeros(n_features)
for i in range(n_features):
for j in range(n_features):
if i!=j:
redundancy[i] += correlation_matrix[i][j] * mutual_information(features[:,i], features[:,j])
最后,我们可以计算每个特征的相关性和冗余度之和,选择得分最高的k个特征。
# 选择k个得分最高的特征
def mrmr(features, labels, k):
scores = np.zeros(n_features)
for i in range(n_features):
scores[i] = feature_label_corr[i] - redundancy[i]
selected = []
for_ in range(k):
remaining = list(set(range(n_features)) - set(selected))
max_score = -np.inf
max_feature = None
for i in remaining:
score = scores[i]
if score > max_score:
max_score = score
max_feature = i
selected.append(max_feature)
return selected
示例
为了更好地说明MRMR算法的应用,我们使用Pima Indians Diabetes数据集进行特征选择和分类。这个数据集包含768个样本,8个特征和1个二元目标变量,目标变量表示一个人是否患有糖尿病。
下面是完整的Python代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
# 数据集文件名
filename = 'pima-indians-diabetes.csv'
# 特征选择的数量
k_features = 4
# 从CSV读取数据
dataset = np.loadtxt(filename, delimiter=",")
# 将特征和目标分开
X = dataset[:,0:8]
y = dataset[:,8]
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# MRMR特征选择
n_features = X_train.shape[1]
correlation_matrix = np.zeros((n_features, n_features))
for i in range(n_features):
for j in range(i+1, n_features):
corr_ij = np.corrcoef(X_train[:,i], X_train[:,j])[0,1]
correlation_matrix[i,j] = corr_ij
correlation_matrix[j,i] = corr_ij
feature_label_corr = np.zeros(n_features)
for i in range(n_features):
feature_label_corr[i] = np.corrcoef(X_train[:,i], y_train)[0,1]
def mutual_information(x,y):
pxy, _ = np.histogramdd([x,y], bins=[len(np.unique(x)),len(np.unique(y))])
pxy = pxy / float(np.sum(pxy))
px = np.sum(pxy, axis=1)
py = np.sum(pxy, axis=0)
px_py = np.outer(px, py)
px_py[px_py == 0] = 1
mi = np.sum(pxy * np.log2(pxy / px_py))
return mi
redundancy = np.zeros(n_features)
for i in range(n_features):
for j in range(n_features):
if i!=j:
redundancy[i] += correlation_matrix[i][j] * mutual_information(X_train[:,i], X_train[:,j])
scores = np.zeros(n_features)
for i in range(n_features):
scores[i] = feature_label_corr[i] - redundancy[i]
selected = []
for i in range(k_features):
remaining = list(set(range(n_features)) - set(selected))
max_score = -np.inf
max_feature = None
for i in remaining:
score = scores[i]
if score > max_score:
max_score = score
max_feature = i
selected.append(max_feature)
# 训练模型并测试
model = LogisticRegression()
model.fit(X_train[:,selected], y_train)
y_pred = model.predict(X_test[:,selected])
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy score:", accuracy)
运行结果:
Accuracy score: 0.7272727272727273
总结
本文介绍了使用Numpy的MRMR算法进行特征选择的方法,并通过一个示例演示了其应用。MRMR算法是一种基于信息论的特征选择算法,可以有效地从数据中选择具有最高相关性和最小冗余的特征子集,以提高模型的精度和效率。