有没有办法确定与我的机器学习模型最相关的功能。如果我有20个功能,是否有一个功能可以决定我应该使用哪些功能(或可以自动删除不相关的功能的功能)? 我计划对回归模型或分类模型进行此操作。
我想要的输出是最相关的值列表和预测
import pandas as pd
from sklearn.linear_model import LinearRegression
dic = {'par_1': [10, 30, 11, 19, 28, 33, 23],
'par_2': [1, 3, 1, 2, 3, 3, 2],
'par_3': [15, 3, 16, 65, 24, 56, 13],
'outcome': [101, 905, 182, 268, 646, 624, 465]}
df = pd.DataFrame(dic)
variables = df.iloc[:,:-1]
results = df.iloc[:,-1]
print(variables.shape)
print(results.shape)
reg = LinearRegression()
reg.fit(variables, results)
x = reg.predict([[18, 2, 21]])[0]
print(x)
答案 0 :(得分:1)
您要查找的术语是 feature selection (功能选择):它可以识别与您的分析最相关的功能。 scikit-learn
库有一个专门的here部分。
另一种可能性是诉诸降维技术,例如PCA(主成分分析)或随机投影。每种技术都有其优缺点,因此很大程度上取决于您拥有的数据和特定的应用程序。
答案 1 :(得分:1)
您可以访问reg
对象的coef_属性:
print(reg.coef_)
称这些权重过于简单,因为它们在线性回归中具有特定含义。但是他们就是你所拥有的。
答案 2 :(得分:1)
使用线性模型时,重要的是使用线性独立的特征。您可以将df.corr()
的相关性可视化:
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.decomposition import PCA
from sklearn.metrics import mean_squared_error
numpy.random.seed(2)
dic = {'par_1': [10, 30, 11, 19, 28, 33, 23],
'par_2': [1, 3, 1, 2, 3, 3, 2],
'par_3': [15, 3, 16, 65, 24, 56, 13],
'outcome': [101, 905, 182, 268, 646, 624, 465]}
df = pd.DataFrame(dic)
print(df.corr())
out:
par_1 par_2 par_3 outcome
par_1 1.000000 0.977935 0.191422 0.913878
par_2 0.977935 1.000000 0.193213 0.919307
par_3 0.191422 0.193213 1.000000 -0.158170
outcome 0.913878 0.919307 -0.158170 1.000000
您可以看到par_1
和par_2
之间有很强的相关性。如@taga所述,您可以使用PCA
将要素映射到线性独立的较低维度空间:
variables = df.iloc[:,:-1]
results = df.iloc[:,-1]
pca = PCA(n_components=2)
pca_all = pca.fit_transform(variables)
print(np.corrcoef(pca_all[:, 0], pca_all[:, 1]))
out:
[[1.00000000e+00 1.87242048e-16]
[1.87242048e-16 1.00000000e+00]]
记住要根据样本数据验证模型:
X_train = variables[:4]
y_train = results[:4]
X_valid = variables[4:]
y_valid = results[4:]
pca = PCA(n_components=2)
pca.fit(X_train)
pca_train = pca.transform(X_train)
pca_valid = pca.transform(X_valid)
print(pca_train)
reg = LinearRegression()
reg.fit(pca_train, y_train)
yhat_train = reg.predict(pca_train)
yhat_valid = reg.predict(pca_valid)
print(mean_squared_error(yhat_train, y_train))
print(mean_squared_error(yhat_valid, y_valid))
功能选择并非易事:有许多sklearn模块可以实现这一功能(请参见docs),您应该始终尝试至少使用其中的几个,看看哪些可以提高样本外性能数据。
答案 3 :(得分:0)
嗯,最初我遇到了相同的问题。我发现选择相关功能有用的两种方法是
1。您可以通过使用模型的特征重要性属性来获取数据集中每个特征的特征重要性。特征重要性是基于树的分类器随附的内置类。
import pandas as pd
import numpy as np
data = pd.read_csv("D://Blogs//train.csv")
X = data.iloc[:,0:20] #independent columns
y = data.iloc[:,-1] #target column i.e price range
from sklearn.ensemble import ExtraTreesClassifier
import matplotlib.pyplot as plt
model = ExtraTreesClassifier()
model.fit(X,y)
print(model.feature_importances_) #use inbuilt class feature_importances of tree based classifiers
#plot graph of feature importances for better visualization
feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(10).plot(kind='barh')
plt.show()
2。带有热图的相关矩阵
Correlation(相关)说明要素如何相互关联或与目标变量关联。 它给出了特征与目标变量之间如何关联的直觉。
这不是我的研究,而是这个博客feature selection,这有助于清除我的疑问,我敢肯定也将解决您的问题。:)