此部分内容会每日更新,包括但不限于基础知识,进阶知识,数据处理,图表展示,数据分析实战,机器学习算法等~
!!!本人统计学硕士在读,想在2024年完成sql、python、R语言、stata、matlab等软件的复盘和巩固,目前在做python的复习~
最近每日都会更新python实践习题!后续考虑出相关视频进行讲解说明,请大家点赞+收藏+持续关注哈,大家一起沟通交流~
数据探索性分析
- 加载一个数据集,并进行基本的数据结构分析(如数据类型、缺失值等)。
- 绘制数据集中某个变量的直方图,观察其分布特征。
- 使用箱线图展示数据集中多个变量的分布情况。
- 计算数据集中各变量的描述性统计量(均值、中位数、标准差等)。
- 绘制变量之间的散点图矩阵,观察变量间的相关性。
- 使用热力图展示变量间的相关系数矩阵。
- 计算数据集中分类变量的频数分布和百分比。
- 绘制分类变量的条形图,比较不同类别的数量。
- 对数据集进行异常值检测,并给出处理建议。
- 对数据集中的缺失值进行填充,并比较不同填充方法的效果。
- 使用数据可视化方法展示数据集中不同特征之间的关联关系。
- 分析数据集中的多重共线性问题,并给出解决方案。
- 对数据集进行降维处理,并比较不同降维方法的效果。
- 对数据集进行聚类分析,并解释聚类结果。
- 根据业务背景,对数据进行合理的特征构造和选择。
首先,安装必要的库(如果尚未安装):
pip install pandas matplotlib seaborn scikit-learn
问题回答:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 假设我们有一个名为'dataset.csv'的数据集文件
# 1. 加载一个数据集,并进行基本的数据结构分析
df = pd.read_csv('dataset.csv')
print(df.info()) # 显示数据类型、缺失值等信息
print(df.describe()) # 显示数值型变量的描述性统计
# 2. 绘制数据集中某个变量的直方图
df['variable_name'].plot(kind='hist', bins=30)
plt.show()
# 3. 使用箱线图展示数据集中多个变量的分布情况
sns.boxplot(data=df[['var1', 'var2', 'var3']])
plt.show()
# 4. 计算数据集中各变量的描述性统计量
descriptive_stats = df.describe()
print(descriptive_stats)
# 5. 绘制变量之间的散点图矩阵
sns.pairplot(df[['var1', 'var2', 'var3']])
plt.show()
# 6. 使用热力图展示变量间的相关系数矩阵
corr_matrix = df.corr()
sns.heatmap(corr_matrix, annot=True)
plt.show()
# 7. 计算数据集中分类变量的频数分布和百分比
cat_var = df['categorical_variable'].value_counts(normalize=True)
print(cat_var)
# 8. 绘制分类变量的条形图
cat_var.plot(kind='bar')
plt.show()
# 9. 对数据集进行异常值检测
# 这里以IQR方法为例
Q1 = df['variable_name'].quantile(0.25)
Q3 = df['variable_name'].quantile(0.75)
IQR = Q3 - Q1
filter = (df['variable_name'] >= Q1 - 1.5 * IQR) & (df['variable_name'] <= Q3 + 1.5 * IQR)
df_filtered = df[filter]
print("Filtered dataset shape:", df_filtered.shape)
# 10. 对数据集中的缺失值进行填充
imputer = SimpleImputer(strategy='mean') # 使用均值填充
df_filled = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
# 11. 使用数据可视化方法展示数据集中不同特征之间的关联关系
# 这可以通过散点图矩阵、热力图等来完成,上面已有示例
# 12. 分析数据集中的多重共线性问题
# 计算VIF
vif = pd.DataFrame()
vif["variables"] = df[['var1', 'var2', 'var3']].columns
vif["VIF"] = [variance_inflation_factor(df[['var1', 'var2', 'var3']].values, i) for i in range(df[['var1', 'var2', 'var3']].shape[1])]
print(vif)
# 解决方案:删除高度相关的变量或使用正则化方法
# 13. 对数据集进行降维处理
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df[['var1', 'var2', 'var3']])
pca = PCA(n_components=2) # 假设我们降至2维
principalComponents = pca.fit_transform(scaled_features)
# 14. 对数据集进行聚类分析
kmeans = KMeans(n_clusters=3) # 假设我们聚为3类
clusters = kmeans.fit_predict(principalComponents)
df['cluster'] = clusters
print(df['cluster'].value_counts())
# 解释聚类结果:需要根据业务背景和聚类结果的具体内容来解释。通常,可以通过查看不同类别中样本的特征平均值或分布来初步理解每个类别的特点。
# 15. 根据业务背景,对数据进行合理的特征构造和选择
# 这需要具体了解业务背景和目标。假设我们有一个年龄变量和一个收入变量,我们想构造一个新的特征“收入阶层”,根据收入水平划分不同的阶层。
# 假设我们有一个简单的划分标准
income_brackets = [0, 30000, 60000, 100000, np.inf]
income_labels = ['Low', 'Medium', 'High', 'Very High']
# 创建新的特征
df['income_bracket'] = pd.cut(df['income'], bins=income_brackets, labels=income_labels)
# 特征选择可以基于相关性、VIF、业务重要性等多种因素进行
selected_features = ['age', 'income_bracket', 'another_important_feature']
selected_df = df[selected_features]```
### 统计分析和假设检验
### 1. 对两个样本进行均值比较,并进行t检验。
```python
import scipy.stats as stats
# 假设有两个样本
sample1 = [1, 2, 3, 4, 5]
sample2 = [3, 4, 5, 6, 7]
# 进行t检验
t_statistic, p_value = stats.ttest_ind(sample1, sample2)
print(f"t-statistic: {t_statistic}")
print(f"p-value: {p_value}")
2. 对分类变量进行卡方检验,比较不同组别的分布差异。
from scipy.stats import chi2_contingency
import pandas as pd
# 假设有一个分类变量的频率表
observed = pd.DataFrame({
'Group': ['A', 'B', 'C'],
'Count': [10, 20, 30]
})
# 进行卡方检验
chi2, p, dof, expected = chi2_contingency(observed['Count'])
print(f"Chi-squared: {chi2}")
print(f"p-value: {p}")
3. 对数据集中某个变量进行方差分析,比较不同组别的均值差异。
from statsmodels.formula.api import ols
import statsmodels.api as sm
# 假设有一个DataFrame,其中包含分组变量'group'和数值变量'value'
df = pd.DataFrame({
'group': ['A', 'B', 'A', 'B', 'C', 'A', 'B', 'C', 'C'],
'value': [1, 2, 3, 4, 5, 6, 7, 8, 9]
})
# 进行方差分析
model = ols('value ~ C(group)', data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)
4. 使用协方差分析控制其他变量的影响,比较不同组别的均值差异。
# 在此基础上添加协变量'covariate'到DataFrame中
df['covariate'] = [10, 11, 9, 12, 10, 11, 9, 10, 12]
# 进行协方差分析
model_ancova = ols('value ~ C(group) + covariate', data=df).fit()
anova_table_ancova = sm.stats.anova_lm(model_ancova, typ=2)
print(anova_table_ancova)
5. 对数据集中两个变量进行相关性分析,并解释结果。
# 计算两个变量之间的相关系数
correlation = df['value'].corr(df['covariate'])
print(f"Correlation: {correlation}")
6. 使用回归分析分析自变量对因变量的影响程度。
# 在之前的ols模型基础上进行分析
print(model_ancova.summary())
7. 对回归模型的假设进行检验,如线性关系、误差项的正态性和同方差性等。
# 线性关系可以通过查看模型的R-squared和可视化残差图来检验
# 正态性和同方差性可以通过绘制残差图和使用统计测试来检验
import matplotlib.pyplot as plt
# 绘制残差图
residuals = model_ancova.resid
plt.scatter(model_ancova.fittedvalues, residuals)
plt.xlabel('Fitted values')
plt.ylabel('Residuals')
plt.show()
# 正态性和同方差性的正式检验通常需要更复杂的统计方法,这里仅通过可视化进行初步检查
8. 对分类问题进行逻辑回归分析,并解释模型结果。
from sklearn.linear_model import LogisticRegression
# 假设我们有一个二分类问题,'target'是目标变量,'feature1'和'feature2'是特征
X = df[['feature1', 'feature2']]
y = df['target']
# 逻辑回归分析
logreg = LogisticRegression()
logreg.fit(X, y)
# 解释模型结果
print(logreg.coef_)
### 9. 使用方差分析或回归分析比较不同模型对数据的拟合效果。
比较不同模型的拟合效果通常涉及到模型选择的标准,比如AIC(赤池信息准则)、BIC(贝叶斯信息准则)或者R-squared值。这里以R-squared值为例:
```python
# 假设我们有两个模型,model1和model2
model1 = ols('value ~ feature1', data=df).fit()
model2 = ols('value ~ feature1 + feature2', data=df).fit()
# 比较R-squared值
print(f"Model 1 R-squared: {model1.rsquared}")
print(f"Model 2 R-squared: {model2.rsquared}")
# 通常,R-squared值更高的模型拟合效果更好
10. 对数据进行时间序列分析,如趋势分析、季节性分析等。
import statsmodels.tsa.stattools as ts
# 假设我们有一个时间序列数据'timeseries'
timeseries = pd.Series([...]) # 用实际数据替换省略号
# 趋势分析,例如计算趋势成分
trend = ts.detrend(timeseries)
# 季节性分析,例如计算季节性成分
seasonal = ts.seasonal_decompose(timeseries)
# 绘制季节性分解图
seasonal.plot()
plt.show()
11. 对数据集进行生存分析,研究某个事件发生的时间分布和影响因素。
生存分析通常使用lifelines
库进行:
from lifelines import CoxPHFitter
# 假设我们有一个DataFrame,包含生存时间'T',事件状态'E'(例如,1表示事件发生,0表示被删失),以及协变量'covariate1', 'covariate2'
df_survival = pd.DataFrame({
'T': [...], # 生存时间
'E': [...], # 事件状态
'covariate1': [...], # 协变量1
'covariate2': [...] # 协变量2
})
# 拟合Cox比例风险模型
cph = CoxPHFitter()
cph.fit(df_survival, duration_col='T', event_col='E')
# 输出模型结果
print(cph.summary)
12. 对数据集中的多变量进行主成分分析,提取主成分并解释其意义。
from sklearn.decomposition import PCA
# 假设我们有一个DataFrame 'X',包含多个变量
X = df[['var1', 'var2', 'var3', 'var4']]
# 初始化PCA并进行拟合
pca = PCA(n_components=2) # 假设我们想要提取两个主成分
X_pca = pca.fit_transform(X)
# 解释主成分
print(f"Explained variance ratio: {pca.explained_variance_ratio_}")
13. 使用因子分析对数据集中的变量进行降维和分类。
因子分析在Python中通常使用factor_analyzer
库进行:
from factor_analyzer import FactorAnalyzer
# 初始化FactorAnalyzer并拟合数据
fa = FactorAnalyzer(n_factors=3, rotation='varimax') # 假设我们想要提取3个因子
fa.fit(X)
# 获取因子载荷
loadings = fa.loadings_
# 解释因子
print(loadings)
14. 对数据集中的变量进行判别分析,构建分类模型并评估其性能。
判别分析可以使用scikit-learn
的LinearDiscriminantAnalysis
或QuadraticDiscriminantAnalysis
:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 假设'X'是特征数据,'y'是目标变量
X = df[['feature1', 'feature2']]
y = df['target']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用线性判别分析
lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)
# 预测测试集
y_pred = lda.predict(X_test)
# 评估模型性能
accuracy = accuracy_score(y_test,y_pred)
print(f"Accuracy of LDA model: {accuracy}")
15. 对数据集中的异常值进行检测和处理。
异常值检测和处理可以使用多种方法,比如IQR(四分位距)规则或者统计测试。这里我们使用IQR方法:
# 假设'value'是我们要检查的变量
Q1 = df['value'].quantile(0.25)
Q3 = df['value'].quantile(0.75)
IQR = Q3 - Q1
# 定义一个函数来识别异常值
def detect_outliers(df, column_name, threshold=1.5):
outliers = df[(df[column_name] < Q1 - threshold * IQR) | (df[column_name] > Q3 + threshold * IQR)]
return outliers
# 检测异常值
outliers = detect_outliers(df, 'value')
# 处理异常值,例如用中位数替换或删除
df['value'] = np.where(df['value'].isin(outliers['value']), df['value'].median(), df['value'])
# 或者
# df = df.drop(outliers.index)
16. 对数据进行聚类分析,识别数据集中的不同群体。
聚类分析可以使用scikit-learn
中的KMeans
或者DBSCAN
等算法:
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 假设'X'是我们要进行聚类的特征数据
X = df[['feature1', 'feature2']]
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 使用KMeans进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_scaled)
# 将聚类标签添加到数据集中
df['cluster'] = kmeans.labels_
# 查看聚类结果
print(df.groupby('cluster').size())
17. 对时间序列数据进行周期性和趋势分析。
周期性和趋势分析可以使用statsmodels
库中的时间序列分解功能:
from statsmodels.tsa.seasonal import seasonal_decompose
# 假设'timeseries'是我们的时间序列数据
timeseries = pd.Series([...]) # 用实际数据替换省略号
# 进行时间序列分解
result = seasonal_decompose(timeseries, model='additive')
# 绘制结果
result.plot()
plt.show()
# 提取趋势和季节性成分
trend = result.trend
seasonal = result.seasonal
18. 使用决策树对数据进行分类,并解释其决策规则。
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_text
# 假设'X'是特征数据,'y'是目标变量
X = df[['feature1', 'feature2']]
y = df['target']
# 使用决策树进行分类
dt_classifier = DecisionTreeClassifier()
dt_classifier.fit(X, y)
# 解释决策规则
rules = export_text(dt_classifier, feature_names=X.columns)
print(rules)
19. 使用随机森林对数据进行分类,并比较其与决策树的性能。
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# 使用随机森林进行分类
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier.fit(X, y)
# 预测测试集(这里使用训练集作为示例)
y_pred_rf = rf_classifier.predict(X)
# 评估随机森林模型的性能
accuracy_rf = accuracy_score(y, y_pred_rf)
print(f"Accuracy of Random Forest: {accuracy_rf}")
# 比较决策树和随机森林的性能
print(f"Decision Tree Accuracy: {accuracy_score(y, dt_classifier.predict(X))}")
print(f"Random Forest Accuracy: {accuracy_rf}")
20. 对数据集中的连续变量进行离散化或分箱处理。
from sklearn.preprocessing import KBinsDiscretizer
# 假设'continuous_var'是我们要离散化的连续变量
continuous_var = df['continuous_var']
# 初始化KBinsDiscretizer并拟合数据
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit(continuous_var.values.reshape(-1, 1))
# 对连续变量进行离散化
discrete_var = est.transform(continuous_var.values.reshape(-1, 1))
# 将离散化后的变量添加回数据集
df['discrete_var'] = discrete_var.flatten()
21. 对数据集中的缺失值进行处理,例如使用均值、中位数或众数进行填充。
# 假设'missing_var'是包含缺失值的变量
# 使用均值填充
df['missing_var'].fillna(df['missing_var'].mean(), inplace=True)
# 使用中位数填充
df['missing_var'].fillna(df['missing_var'].median(), inplace=True)
# 使用众数填充(需要安装`scipy`库)
from scipy.stats import mode
mode_val = mode(df['missing_var'].dropna())[0][0]
df['missing_var'].fillna(mode_val, inplace=True)
22. 对数据集进行特征选择,选择最重要的特征用于建模。
特征选择可以使用多种方法,如基于模型的特征选择、基于统计测试的特征选择等。以下是使用基于模型的特征选择的一个例子:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
# 假设'X'是特征数据,'y'是目标变量
X = df.drop('target', axis=1)
y = df['target']
# 使用逻辑回归模型进行特征选择
lr = LogisticRegression()
lr.fit(X, y)
# 选择系数绝对值大于某阈值的特征
sfm = SelectFromModel(lr, threshold=0.01)
sfm.fit(X, y)
机器学习算法应用
1. 使用线性回归算法对数据进行拟合,并评估模型的性能。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 假设 X 是特征矩阵,y 是目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
# 预测测试集
y_pred = model.predict(X_test)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
print(f"R^2 Score: {r2:.2f}")
2. 使用决策树算法对数据进行分类,并解释模型结果。
from sklearn.tree import DecisionTreeClassifier
# 初始化模型
clf = DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 模型结果解释(例如:查看特征重要性)
importances = clf.feature_importances_
print("Feature importances:", importances)
3. 使用随机森林算法对数据进行分类或回归,并比较与决策树的效果。
from sklearn.ensemble import RandomForestClassifier
# 初始化随机森林模型
rf_clf = RandomForestClassifier()
# 训练模型
rf_clf.fit(X_train, y_train)
# 预测测试集
rf_y_pred = rf_clf.predict(X_test)
# 比较决策树和随机森林的效果(例如:通过准确率)
# ...(省略比较代码)
4. 对数据集进行K-均值聚类,并解释聚类结果。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 初始化K-均值模型
kmeans = KMeans(n_clusters=3, random_state=42)
# 训练模型
kmeans.fit(X)
# 获取聚类标签
labels = kmeans.labels_
# 可视化聚类结果(如果数据集是二维的)
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.show()
# 解释聚类结果(例如:查看聚类中心)
centroids = kmeans.cluster_centers_
print("Cluster centroids:", centroids)
5. 使用支持向量机(SVM)算法对数据进行分类,并调整参数优化模型性能。
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
# 初始化SVM模型
svm_clf = SVC(kernel='rbf')
# 定义要搜索的参数网格
param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001]}
# 使用网格搜索进行参数调优
grid_search = GridSearchCV(svm_clf, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters found:", grid_search.best_params_)
# 使用最佳参数进行预测
best_svm_clf = grid_search.best_estimator_
y_pred = best_svm_clf.predict(X_test)
6. 使用朴素贝叶斯算法对文本数据进行分类,并评估分类效果。
首先,我们需要将文本数据转换为数值型特征向量,通常使用TF-IDF(词频-逆文档频率)方法。然后,使用朴素贝叶斯分类器进行训练和预测。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 假设 X_text 是包含文本的列表,y 是对应的标签
vectorizer = TfidfVectorizer()
X_tfidf = vectorizer.fit_transform(X_text)
# 初始化朴素贝叶斯分类器
nb_clf = MultinomialNB()
# 训练模型
nb_clf.fit(X_tfidf.toarray(), y)
# 预测测试集(假设 X_test_text 是测试集的文本数据)
X_test_tfidf = vectorizer.transform(X_test_text)
y_pred = nb_clf.predict(X_test_tfidf.toarray())
# 评估分类效果
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
7. 使用逻辑回归算法对二分类问题进行建模,并解释模型系数。
from sklearn.linear_model import LogisticRegression
# 初始化逻辑回归模型
log_reg = LogisticRegression()
# 训练模型
log_reg.fit(X_train, y_train)
# 预测测试集
y_pred = log_reg.predict(X_test)
# 评估模型性能(例如:使用准确率)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
# 解释模型系数
print("Coefficients:", log_reg.coef_)
print("Intercept:", log_reg.intercept_)
# 系数表示每个特征对目标变量的影响,正值表示正相关,负值表示负相关。
8. 对数据集进行主成分分析(PCA)降维,并使用机器学习算法进行分类或回归。
from sklearn.decomposition import PCA
# 初始化PCA
pca = PCA(n_components=2) # 假设我们想要降到2维
# 对数据进行PCA降维
X_pca = pca.fit_transform(X)
# 使用降维后的数据进行机器学习(例如使用逻辑回归)
log_reg_pca = LogisticRegression()
log_reg_pca.fit(X_pca, y)
# 预测和评估(省略)
# ...
9. 使用梯度提升树(GBDT)算法对数据进行分类或回归,并比较与其他算法的效果。
from sklearn.ensemble import GradientBoostingClassifier
# 初始化GBDT模型
gbdt_clf = GradientBoostingClassifier()
# 训练模型
gbdt_clf.fit(X_train, y_train)
# 预测测试集
y_pred = gbdt_clf.predict(X_test)
# 比较与其他算法的效果(省略)
# ...
10. 使用集成学习方法(如AdaBoost、Bagging等)提升模型性能。
from sklearn.ensemble import AdaBoostClassifier, BaggingClassifier
# 使用AdaBoost集成方法
ada_clf = AdaBoostClassifier()
ada_clf.fit(X_train, y_train)
ada_y_pred = ada_clf.predict(X_test)
# 使用Bagging集成方法
bag_clf = BaggingClassifier()
bag_clf.fit(X_train, y_train)
bag_y_pred = bag_clf.predict(X_test)
# 比较集成方法与其他模型的效果(省略)
# ...
11. 对不平衡分类问题进行处理,如使用过采样、欠采样或调整分类阈值。
处理不平衡分类问题可以使用imblearn
库中的方法。
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
# 假设 min_class 是少数类的标签
min_class_samples = y[y == min_class].shape[0]
max_class_samples = y[y != min_class].shape[0]
### 11. 对不平衡分类问题进行处理,如使用过采样、欠采样或调整分类阈值。(续)
```python
# 使用过采样
ros = RandomOverSampler(sampling_strategy=max_class_samples, random_state=42)
X_resampled, y_resampled = ros.fit_resample(X, y)
# 使用欠采样
rus = RandomUnderSampler(sampling_strategy=min_class_samples, random_state=42)
X_resampled, y_resampled = rus.fit_resample(X, y)
# 训练模型(以逻辑回归为例)
log_reg = LogisticRegression()
log_reg.fit(X_resampled, y_resampled)
# 调整分类阈值
# 预测概率
y_prob = log_reg.predict_proba(X_test)[:, 1]
# 假设我们想要更高的召回率,可以设置一个较低的阈值
threshold = 0.3
y_pred_thresh = (y_prob >= threshold).astype(int)
# 评估调整阈值后的模型性能
# ...
12. 使用K-means算法对数据进行聚类,并可视化聚类结果。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 假设 X 是要聚类的数据
kmeans = KMeans(n_clusters=3) # 假设我们想要分成3个簇
kmeans.fit(X)
# 获取聚类标签
labels = kmeans.labels_
# 可视化聚类结果(这里假设X是二维数据)
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red')
plt.title('K-means Clustering')
plt.show()
13. 使用决策树对特征重要性进行排序,并解释最重要的特征。
from sklearn.tree import DecisionTreeClassifier
# 初始化决策树分类器
dt_clf = DecisionTreeClassifier()
# 训练模型
dt_clf.fit(X_train, y_train)
# 获取特征重要性
importances = dt_clf.feature_importances_
indices = np.argsort(importances)[::-1]
# 打印特征排名
print("Feature ranking:")
for f in range(X_train.shape[1]):
print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
# 解释最重要的特征
# ...(需要根据具体的业务背景和数据进行解释)
14. 使用交叉验证和网格搜索进行模型调参。
from sklearn.model_selection import GridSearchCV, cross_val_score
# 初始化模型
log_reg = LogisticRegression()
# 定义要搜索的参数网格
param_grid = {
'C': [0.1, 1, 10, 100],
'penalty': ['l1', 'l2']
}
# 使用网格搜索和交叉验证
grid_search = GridSearchCV(log_reg, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters set found on development set:")
print()
print(grid_search.best_params_)
print()
print("Grid scores on development set:")
print()
means = grid_search.cv_results_['mean_test_score']
stds = grid_search.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, grid_search.cv_results_['params']):
print("%0.3f (+/-%0.03f) for %r"
% (mean, std * 2, params))
print()
# 使用最佳参数重新训练模型
best_log_reg = grid_search.best_estimator_
15. 使用主成分分析(PCA)进行降维,并可视化降维后的数据。
from sklearn.decomposition import PCA
# 初始化PCA
pca = PCA(n_components=2) # 假设我们想要降到2维
# 对数据进行PCA降维
X_pca = pca.fit_transform(X)
# 可视化降维后的数据
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.title('PCA-reduced data')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()
16. 使用t-SNE进行高维数据的可视化。
from sklearn.manifold import TSNE
# 初始化t-SNE
tsne = TSNE(n_components=2, random_state=42)
# 对数据进行t-SNE降维
X_tsne = tsne.fit_transform(X)
# 可视化t-SNE降维后的数据
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis')
plt.title('t-SNE visualization')
plt.show()
17. 使用随机森林进行特征选择。
from sklearn.ensemble import RandomForestClassifier
# 初始化随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
rf.fit(X_train, y_train)
# 获取特征重要性
importances = rf.feature_importances_
# 打印特征重要性
for feature, importance in zip(X_train.columns, importances):
print(f"{feature}: {importance:.3f}")
# 选择最重要的特征
n_features_to_select = 10
indices = np.argsort(importances)[::-1]
selected_features = X_train.columns[indices[:n_features_to_select]]
# 使用选定的特征重新训练模型
X_train_selected = X_train[selected_features]
rf_selected = RandomForestClassifier(n_estimators=100, random_state=42)
rf_selected.fit(X_train_selected, y_train)
18. 使用集成方法(如Bagging或Boosting)提升模型性能。
from sklearn.ensemble import BaggingClassifier, AdaBoostClassifier
# 使用Bagging
bagging_clf = BaggingClassifier(base_estimator=LogisticRegression(), n_estimators=10, random_state=42)
bagging_clf.fit(X_train, y_train)
# 使用AdaBoost
ada_clf = AdaBoostClassifier(base_estimator=LogisticRegression(), n_estimators=50, random_state=42)
ada_clf.fit(X_train, y_train)
# 评估集成模型的性能
# ...
19. 使用XGBoost模型,并进行超参数优化。
import xgboost as xgb
from sklearn.model_selection import RandomizedSearchCV
# 初始化XGBoost分类器
xgb_clf = xgb.XGBClassifier(use_label_encoder=False, objective='binary:logistic')
# 定义要搜索的参数网格
param_grid = {
'n_estimators': [50, 100, 200],
'learning_rate': [0.01, 0.05, 0.1],
'max_depth': [3, 5, 7],
'subsample': [0.6, 0.8, 1.0],
'colsample_bytree': [0.6, 0.8, 1.0]
}
# 使用随机搜索和交叉验证进行超参数优化
random_search = RandomizedSearchCV(xgb_clf, param_distributions=param_grid, n_iter=10, cv=3, random_state=42)
random_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters set found on development set:")
print()
print(random_search.best_params_)
20. 使用最佳参数重新训练XGBoost模型,并评估其性能。
# 使用最佳参数重新初始化XGBoost分类器
xgb_clf_best = xgb.XGBClassifier(
use_label_encoder=False,
objective='binary:logistic',
n_estimators=random_search.best_params_['n_estimators'],
learning_rate=random_search.best_params_['learning_rate'],
max_depth=random_search.best_params_['max_depth'],
subsample=random_search.best_params_['subsample'],
colsample_bytree=random_search.best_params_['colsample_bytree']
)
# 训练模型
xgb_clf_best.fit(X_train, y_train)
# 预测训练集和测试集
y_train_pred = xgb_clf_best.predict(X_train)
y_test_pred = xgb_clf_best.predict(X_test)
# 评估模型性能
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)
print(f"Training Accuracy: {train_accuracy:.4f}")
print(f"Test Accuracy: {test_accuracy:.4f}")
# 还可以计算其他指标,如精确率、召回率、F1分数等
from sklearn.metrics import precision_score, recall_score, f1_score
train_precision = precision_score(y_train, y_train_pred)
train_recall = recall_score(y_train, y_train_pred)
train_f1 = f1_score(y_train, y_train_pred)
test_precision = precision_score(y_test, y_test_pred)
test_recall = recall_score(y_test, y_test_pred)
test_f1 = f1_score(y_test, y_test_pred)
print(f"Training Precision: {train_precision:.4f}")
print(f"Training Recall: {train_recall:.4f}")
print(f"Training F1 Score: {train_f1:.4f}")
print(f"Test Precision: {test_precision:.4f}")
print(f"Test Recall: {test_recall:.4f}")
print(f"Test F1 Score: {test_f1:.4f}")