代码题
# 1. 使用 Pandas 库读取 “某 APP 用户信息数据.csv” 数据集。 | |
import pandas as pd | |
import warnings | |
warnings.filterwarnings('ignore') | |
user=pd.read_csv(r'F:\3.homework\大三下\数据分析\实验数据data\某APP用户信息数据.csv',encoding='gbk') | |
# 2. 将不愿分享概率与愿意分享概率特征中的缺失值用 0.0 替换。 | |
user['不愿分享概率']=user['不愿分享概率'].fillna(0.0) | |
user['愿意分享概率']=user['愿意分享概率'].fillna(0.0) | |
# 3. 将不愿分享概率与愿意分享概率特征中负值赋值为 0, 并将大于 1 的值改为 1。 | |
user['不愿分享概率'][user['不愿分享概率']<0]=0 | |
user['不愿分享概率'][user['不愿分享概率']>0]=1 | |
user['愿意分享概率'][user['愿意分享概率']<0]=0 | |
user['愿意分享概率'][user['愿意分享概率']>0]=1 | |
# 4. 将是否点击分享特征中的 T 重新赋值为 1, 将 F 重新赋值为 0。 | |
user['是否点击分享'][user['是否点击分享']=='T']=1 | |
user['是否点击分享'][user['是否点击分享']=='F']=0 | |
# (2) 构建与用户使用信息相关的特征。 | |
user_clean=user | |
# 1. 自定义 to_code 函数,用于对用户名特征首字母进行编码。 | |
coding={} | |
for i in range(26): | |
coding[chr(ord('a')+i)]=i | |
def to_code(s): | |
code=0 | |
s=s.lower()[0] | |
if s in coding: | |
code=coding[s] | |
return code | |
# 2. 对在线时长特征进行分段处理后生成分段在线时长新特征。 | |
user_clean['分组后在线时长']=pd.qcut(user_clean['在线时长'],4,labels=[4,3,2,1]) | |
# 3. 使用 apply 方法构建首字母编码新特征。 | |
user_clean['用户编码']=user_clean['用户名'].apply(lambda x : to_code(x)) | |
# (3) 构建 K-Means 聚类模型。 | |
user_f=user_clean | |
# 1. 读取构建新特征后的数据集,区分标签和数据。 | |
X=user_f[['不愿分享概率','愿意分享概率','在线时长','在线时长占比','分组后在线时长']] | |
y=user_f['是否点击分享'] | |
from sklearn.cluster import KMeans | |
from sklearn.metrics import fowlkes_mallows_score | |
# 2. 构建 K-Means 模型,且聚类数为 2。 | |
model=KMeans(n_clusters=2).fit(X) | |
# 3. 使用 FMI 评价法评价聚类模型性能。 | |
fmi=fowlkes_mallows_score(y, model.labels_) | |
print(fmi) | |
# 使用用户在交易软件上的交易数据 (phone.csv),预测回收二手手机的价格。 | |
# 现需利用交易数据建立分类模型对二手手机价格进行预测,步骤如下。 | |
import pandas as pd | |
data=pd.read_csv(r"F:\3.homework\大三下\数据分析\实验数据data\phone.csv") | |
# (1) 删除有异常值的行 (手机厚度小于等于 0cm)。 | |
phone_data1=data[data['m_dep']>0] | |
phone_data=phone_data1.drop(['price_range'],axis=1) | |
phone_target=phone_data1['price_range'] | |
# (2) 建立随机森林分类模型对数据进行训练。 | |
# 将数据划分为训练集测试集,其中测试集占总数据的 30%,随机种子设置为 22。 | |
from sklearn.model_selection import train_test_split | |
phone_data_train,phone_data_test,phone_target_train,phone_target_test=train_test_split(phone_data,phone_target,test_size=0.3,random_state=22) | |
# 数据标准化 | |
from sklearn.preprocessing import StandardScaler | |
stScaler=StandardScaler().fit(phone_data_train) | |
phone_trainStd=stScaler.transform(phone_data_train) | |
phone_testStd=stScaler.transform(phone_data_test) | |
# 建立 RandomForestClassifier 模型 (随机森林) | |
from sklearn.ensemble import RandomForestClassifier | |
rfc=RandomForestClassifier().fit(phone_trainStd,phone_target_train) | |
print('建立的 rfc 模型为:\n', rfc) | |
# (3) 计算模型准确率,评价分类模型效果。 | |
# 预测训练集结果 | |
phone_target_pred=rfc.predict(phone_testStd) | |
print('预测的前 20 个结果为:\n', phone_target_pred[:20]) | |
# 计算准确率 | |
import numpy as np | |
true =np.sum(phone_target_pred == phone_target_test) # 预测正确量 | |
print('预测对的结果数目为:', true) | |
print('预测错的的结果数目为:', phone_target_test.shape[0] - true) | |
print('预测结果准确率为:', true / phone_target_test.shape[0]) | |
import pandas as pd | |
size_data=pd.read_csv(r'F:\3.homework\大三下\数据分析\实验数据data\size_data.csv') | |
print(size_data.shape) | |
size_data=size_data.dropna() | |
null=size_data.isnull().sum() | |
print(null) | |
size_data=size_data[size_data['age']>=18] | |
size_data=size_data[size_data['weight']>=30] | |
size_data=size_data.reset_index(drop=True) | |
age_min=size_data['age'].min() | |
weight_min=size_data['weight'].min() | |
print(age_min,weight_min) | |
# 构建 BML_ range 特征 | |
size_data['BMI']=size_data['weight']/((size_data['height']/100)**2) | |
def bmi_range(data): | |
for i in range(len(data)): | |
if data[i]<18.5: | |
data[i]=0 | |
elif 18.5<=data[i]<24: | |
data[i]=1 | |
elif 24<=data[i]<28: | |
data[i] = 2 | |
elif data[i]>=28: | |
data[i] = 3 | |
size_data['BMI_range']=size_data['BMI'] | |
bmi_range(size_data['BMI_range']) | |
size_data_end=size_data | |
# 规划训练集和测试集 | |
size_data=size_data_end.drop('size',axis=1) | |
size_target=size_data_end['size'] | |
from sklearn.model_selection import train_test_split | |
size_data_train,size_data_test,size_target_train,size_target_test=train_test_split( | |
size_data,size_target,test_size=0.2,random_state=22,shuffle=True,stratify=size_target | |
) | |
# 标准化 | |
from sklearn.preprocessing import StandardScaler | |
scale=StandardScaler().fit(size_data_train) | |
size_train_scale=scale.transform(size_data_train) # 建模准备 | |
size_test_scale=scale.transform(size_data_test) # 预测准备 | |
# 建模支持向量机 svm、决策树 dtc、随机森林分类模型 rfc | |
# 支持向量机 svm | |
from sklearn.svm import SVC | |
svn=SVC().fit(size_train_scale,size_target_train) | |
svn_pred=svn.predict(size_test_scale) | |
# 决策树 dtc | |
from sklearn.tree import DecisionTreeClassifier | |
dtc=DecisionTreeClassifier().fit(size_train_scale,size_target_train) | |
dtc_pred=dtc.predict(size_test_scale) | |
# 随机森林 rfc | |
from sklearn.ensemble import RandomForestClassifier | |
rfc=RandomForestClassifier().fit(size_train_scale,size_target_train) | |
rfc_pred=rfc.predict(size_test_scale) | |
from sklearn.metrics import confusion_matrix | |
from sklearn.metrics import precision_score | |
from sklearn.metrics import recall_score | |
from sklearn.metrics import f1_score | |
def test_pre(y,pred): | |
print('混淆矩阵:\n',confusion_matrix(y,pred,labels=['S','M','L','XL'])) | |
print('准确率:\n', precision_score(y,pred,average='macro')) | |
print('召回率:\n', recall_score(y,pred,average='macro')) | |
print('F1值:\n',f1_score(y,pred,average='macro') ) | |
print('SVM 模型预测结果:') | |
test_pre(size_target_test, svn_pred) | |
print('决策树 模型预测结果:') | |
test_pre(size_target_test, dtc_pred) | |
print('随机森林 模型预测结果:') | |
test_pre(size_target_test, rfc_pred) | |
# (1) 读取钻石价格数据集 (diamond_price.csv)。 | |
import pandas as pd | |
diamond = pd.read_csv(r"F:\3.homework\大三下\数据分析\实验数据data\diamond_price.csv", encoding='gbk') | |
# (2) 经过观察数据发现,长度、宽度、高度特征存在 0 值,删除该 3 个特征中所有出现 0 值的行数据,并对其他数据进行重新索引。 | |
diamond = diamond.drop(diamond[ | |
(diamond['X(length)'] == 0) | | |
(diamond['Y(width)'] == 0) | | |
(diamond['Z(Depth)'] == 0)].index) | |
# 对其他数据进行重新索引。 | |
diamond.reset_index(inplace=True,drop=True) | |
# (3) 新增价格 (人民币) 特征,假定 1 美元等于 6.50 人民币。 | |
diamond['price_RMB'] = diamond['Price(in US dollars)'] * 6.50 | |
# (4) 拆分特征数据和标签数据,特征数据为克拉、切工等级、色泽、净度、台宽比、长度、宽度、高度,标签数据为价格 (人民币) 特征。 | |
diamond_data = diamond.iloc[:, :-2] | |
diamond_target = diamond.iloc[:, -1] | |
# (5) 划分训练集和测试集,并对训练集和测试集进行标准差标准化。 | |
# 划分训练集和测试集 | |
from sklearn.model_selection import train_test_split | |
diamond_data_train, diamond_data_test, diamond_target_train, diamond_target_test = train_test_split( | |
diamond_data, diamond_target, test_size=0.2,random_state=2 | |
) | |
# 标准差标准化 | |
from sklearn.preprocessing import StandardScaler | |
scale = StandardScaler().fit(diamond_data_train,diamond_target_train) | |
diamond_trainScaler = scale.transform(diamond_data_train) | |
diamond_testScaler = scale.transform(diamond_data_test) | |
# (6) 构建 SVR 等至少两种回归模型进行钻石价格预测,并输出回归模型评价指标,查看模型效果。 | |
# 构建回归模型 | |
from sklearn.svm import LinearSVR | |
# 支持向量回归 | |
SVR_diamond = LinearSVR().fit(diamond_data_train, diamond_target_train) | |
y_pred1 = SVR_diamond.predict(diamond_data_test) | |
#梯度提升回归 | |
from sklearn.ensemble import GradientBoostingRegressor | |
GBR_diamond = GradientBoostingRegressor().fit(diamond_trainScaler, diamond_target_train) | |
y_pred2 = GBR_diamond.predict(diamond_testScaler) | |
#回归决策树 | |
from sklearn.tree import DecisionTreeRegressor | |
DTR_diamond = DecisionTreeRegressor().fit(diamond_trainScaler, diamond_target_train) | |
y_pred3 = DTR_diamond .predict(diamond_testScaler) | |
#线性回归 | |
from sklearn.linear_model import LinearRegression | |
LR_diamond = LinearRegression().fit(diamond_trainScaler, diamond_target_train) | |
y_pred4 = LR_diamond .predict(diamond_testScaler) | |
#最近邻回归 | |
from sklearn.neighbors import KNeighborsRegressor | |
KNR_diamond = KNeighborsRegressor().fit(diamond_trainScaler, diamond_target_train) | |
y_pred5 = DTR_diamond .predict(diamond_testScaler) | |
#定义评价函数 | |
from sklearn.metrics import explained_variance_score, r2_score | |
def test(y0,y1): | |
print('回归模型的可解释方差值为:', | |
explained_variance_score(y0,y1)) | |
print('回归模型的R方值为:', | |
r2_score(y0, y1)) | |
print("支持向量回归:") | |
test(diamond_target_test, y_pred1) | |
print("梯度提升回归:") | |
test(diamond_target_test, y_pred2) | |
print("回归决策树:") | |
test(diamond_target_test, y_pred3) | |
print("线性回归:") | |
test(diamond_target_test, y_pred4) | |
print("最近邻回归:") | |
test(diamond_target_test, y_pred5) |