下面我会详细讲解“分享15 个python中的 Scikit-Learn 技能”的完整攻略。
分享15个Python中的Scikit-Learn技能
Scikit-Learn是Python中一个非常强大的机器学习库。在本文中,我们将分享15个在Scikit-Learn中应该知道的技术。
1. 数据集载入
Scikit-Learn中自带了一些常用的数据集,可以通过以下方式进行载入:
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
这里载入了iris鸢尾花数据集,其中X
是数据,y
是标签。
2. 数据集分割
为了评估机器学习模型的性能,我们通常需要将数据集分成训练集和测试集。可以使用Scikit-Learn中的train_test_split()
进行数据集分割。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
这里将数据集分成了训练集和测试集,测试集占总数据集的30%,随机数种子为42。
3. 特征缩放
特征缩放是指将特征值按照一定的比例缩放,可以使用StandardScaler()
或MinMaxScaler()
进行特征缩放。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
这里用StandardScaler()
进行特征缩放。
4. 特征选择
特征选择是指从原始的特征集中选择一个最有代表性的子集。可以使用SelectKBest()
进行特征选择。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
selector = SelectKBest(f_classif, k=2)
X_train = selector.fit_transform(X_train, y_train)
X_test = selector.transform(X_test)
这里使用SelectKBest()
选择最好的两个特征。
5. 网格搜索
网格搜索是指在给定的参数网格中搜索最佳的参数组合。可以使用GridSearchCV()
进行网格搜索。
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [0.1, 1, 10, 100], 'kernel': ['rbf', 'linear']}
clf = GridSearchCV(SVC(), param_grid)
clf.fit(X_train, y_train)
print(clf.best_params_)
这里对SVM进行网格搜索,给定了C、gamma和kernel的参数网格。最佳参数组合可以通过best_params_
属性找到。
6. 交叉验证
交叉验证是指将数据集分成若干个子集,每个子集轮流作为测试集和训练集进行模型评估。可以使用cross_val_score()
进行交叉验证。
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
scores = cross_val_score(clf, X_train, y_train, cv=5)
print('Accuracy: %0.2f (+/- %0.2f)' % (scores.mean(), scores.std() * 2))
这里使用了5折交叉验证,并计算了平均精度和标准差。
7. 学习曲线
学习曲线是指训练集和测试集上的模型性能随着样本数量变化的曲线。可以使用learning_curve()
进行学习曲线绘制。
from sklearn.model_selection import learning_curve
import numpy as np
train_sizes, train_scores, test_scores = learning_curve(SVC(kernel='linear'), X, y, cv=10, scoring='accuracy', train_sizes=np.linspace(0.1, 1.0, 10))
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)
plt.plot(train_sizes, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')
plt.fill_between(train_sizes, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')
plt.plot(train_sizes, test_mean, color='green', linestyle='--', marker='s', markersize=5, label='validation accuracy')
plt.fill_between(train_sizes, test_mean + test_std, test_mean - test_std, alpha=0.15, color='green')
plt.xlabel('Number of training samples')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.ylim([0.8, 1.0])
plt.show()
这里绘制了SVM模型的学习曲线。
示例一
现在我将结合特征缩放、特征选择、网格搜索、交叉验证和学习曲线,对一个基于鸢尾花数据集的多分类问题进行处理。
首先,我们需要载入数据集。
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
然后将数据集分成训练集和测试集,并进行特征缩放。
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
进行特征选择。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif
selector = SelectKBest(f_classif, k=2)
X_train = selector.fit_transform(X_train, y_train)
X_test = selector.transform(X_test)
进行网格搜索。
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [0.1, 1, 10, 100], 'kernel': ['rbf', 'linear']}
clf = GridSearchCV(SVC(), param_grid)
clf.fit(X_train, y_train)
print(clf.best_params_)
进行交叉验证。
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
scores = cross_val_score(clf, X_train, y_train, cv=5)
print('Accuracy: %0.2f (+/- %0.2f)' % (scores.mean(), scores.std() * 2))
绘制学习曲线。
from sklearn.model_selection import learning_curve
import numpy as np
import matplotlib.pyplot as plt
train_sizes, train_scores, test_scores = learning_curve(SVC(kernel='linear', C=clf.best_params_['C'], gamma=clf.best_params_['gamma']), X_train, y_train, cv=10, scoring='accuracy', train_sizes=np.linspace(0.1, 1.0, 10))
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)
plt.plot(train_sizes, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')
plt.fill_between(train_sizes, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')
plt.plot(train_sizes, test_mean, color='green', linestyle='--', marker='s', markersize=5, label='validation accuracy')
plt.fill_between(train_sizes, test_mean + test_std, test_mean - test_std, alpha=0.15, color='green')
plt.xlabel('Number of training samples')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.ylim([0.8, 1.0])
plt.show()
运行之后,我们可以得到最佳的参数组合和学习曲线。这个例子将鸢尾花数据集作为了一个多分类问题来解决,但是方法也是通用的。你可以根据自己数据的不同,进行相应的更改。
示例二
下面我们来看看如何使用Scikit-Learn来完成一个简单的线性回归问题。
首先,我们需要载入数据集。
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
y = boston.target
然后,我们将数据集分成训练集和测试集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
进行特征缩放。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
训练模型。
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train, y_train)
做出预测并计算均方误差。
from sklearn.metrics import mean_squared_error
y_pred = reg.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print('MSE:', mse)
在这个例子中,我们使用了Scikit-Learn中的LinearRegression()
模型来拟合数据。我们使用了StandardScaler()
来进行特征缩放。最后用mean_squared_error()
计算了均方误差。
综上所述,本文中我们分享了15个在Scikit-Learn中应该知道的技术,包括了数据集载入、数据集分割、特征缩放、特征选择、网格搜索、交叉验证和学习曲线等。我们还通过两个例子分别介绍了多分类和线性回归问题的解决方法。希望这些技术可以帮助你更好地使用Scikit-Learn来解决机器学习问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:分享15 个python中的 Scikit-Learn 技能 - Python技术站