1. Genel Bakış
Bu laboratuvarda, Python'u kullanarak verilerden analiz elde etmek için BigQuery Studio'daki bir Python not defterinden BigQuery veri çerçevelerini kullanacaksınız. Yapılandırılmamış metin verilerini analiz etmek ve görselleştirmek için Google'ın üretken yapay zekasından yararlanın.
Herkese açık bir müşteri şikayeti veritabanını kategorize etmek ve özetlemek için bir Python not defteri oluşturacaksınız. Bu, herhangi bir yapılandırılmamış metin verisi üzerinde çalışacak şekilde uyarlanabilir.
Hedefler
Bu laboratuvarda, aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz:
- BigQuery Studio'da Python not defterlerini etkinleştirme ve kullanma
- BigQuery DataFrames paketini kullanarak BigQuery'ye bağlanma
- BigQuery ML'yi ve Vertex AI'daki bir metin yerleştirme uç noktasına bağlantıyı kullanarak yapılandırılmamış metin verilerinden yerleştirmeler oluşturma
- BigQuery ML'yi kullanarak küme yerleştirmeleri
- BigQuery ML aracılığıyla kümeleri LLM ile özetleme
2. Şartlar
Başlamadan önce
Bu kod laboratuvarındaki talimatları uygulamak için BigQuery Studio'nun etkinleştirildiği ve bağlı bir faturalandırma hesabının bulunduğu bir Google Cloud projesine ihtiyacınız vardır.
- Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
- Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Projede faturalandırmanın etkin olup olmadığını nasıl kontrol edeceğinizi öğrenin.
- Öğe yönetimi için BigQuery Studio'yu etkinleştirme talimatlarını uygulayın.
BigQuery Studio'yu hazırlama
Boş bir not defteri oluşturup bir çalışma zamanına bağlayın.
- Google Cloud Console'da BigQuery Studio'ya gidin.
- + düğmesinin yanındaki ▼ simgesini tıklayın.
- Python not defteri'ni seçin.
- Şablon seçiciyi kapatın.
- Yeni bir kod hücresi oluşturmak için + Kod'u seçin.
- BigQuery DataFrames paketinin en son sürümünü kod hücresinden yükleyin.Aşağıdaki komutu yazın.
Kod hücresini çalıştırmak için 🞂 düğmesini tıklayın veya Üst Karakter + Enter tuşlarına basın.%pip install --upgrade bigframes --quiet
3. Herkese açık veri kümesini okuma
Yeni bir kod hücresinde aşağıdakileri çalıştırarak BigQuery DataFrames paketini başlatın:
import bigframes.pandas as bpd
bpd.options.bigquery.ordering_mode = "partial"
Not: Bu eğitimde, deneysel "kısmi sıralama modunu" kullanıyoruz. Bu mod, pandas benzeri filtrelemeyle birlikte kullanıldığında daha verimli sorgulara olanak tanır. Sıkı bir sıralama veya dizin gerektiren bazı pandas özellikleri çalışmayabilir.
Tüketici Şikayeti Veritabanı
Tüketici Şikayeti Veritabanı, Google Cloud'un herkese açık veri kümesi programı aracılığıyla BigQuery'de sağlanır. Bu, tüketici finansal ürünleri ve hizmetleriyle ilgili şikayetlerin bir koleksiyonudur ve veriler Amerika Birleşik Devletleri Tüketici Finansal Koruma Bürosu tarafından toplanır.
Tüketici Şikayeti Veritabanı'nı analiz etmek için BigQuery'de bigquery-public-data.cfbp_complaints.complaint_database tablosunu sorgulayın. Sorgu dizesinden veya tablo kimliğinden DataFrame oluşturmak için bigframes.pandas.read_gbq()
yöntemini kullanın.
"feedback" adlı bir DataFrame oluşturmak için yeni bir kod hücresinde aşağıdakileri çalıştırın:
feedback = bpd.read_gbq(
"bigquery-public-data.cfpb_complaints.complaint_database"
)
Veri çerçevesi hakkında temel bilgileri keşfetme
Verilerin küçük bir örneğini indirmek için DataFrame.peek()
yöntemini kullanın.
Bu hücreyi çalıştırın:
feedback.peek()
Beklenen çıkış:
date_received product ... timely_response consumer_disputed complaint_id
0 2014-03-05 Bank account or service ... True False 743665
1 2014-01-21 Bank account or service ... True False 678608
2 2020-12-31 Debt collection ... True <NA> 4041190
3 2014-02-12 Debt collection ... True False 714350
4 2015-02-23 Debt collection ... True False 1251358
Not: head()
, sıralama gerektirir ve bir veri örneğini görselleştirmek istiyorsanız genellikle peek()
'ten daha az etkilidir.
Pandas'da olduğu gibi, mevcut tüm sütunları ve bunlara karşılık gelen veri türlerini görmek için DataFrame.dtypes
mülkünü kullanın. Bunlar pandas ile uyumlu bir şekilde gösterilir.
Bu hücreyi çalıştırın:
feedback.dtypes
Beklenen çıkış:
date_received date32[day][pyarrow]
product string[pyarrow]
subproduct string[pyarrow]
issue string[pyarrow]
subissue string[pyarrow]
consumer_complaint_narrative string[pyarrow]
company_public_response string[pyarrow]
company_name string[pyarrow]
state string[pyarrow]
zip_code string[pyarrow]
tags string[pyarrow]
consumer_consent_provided string[pyarrow]
submitted_via string[pyarrow]
date_sent_to_company date32[day][pyarrow]
company_response_to_consumer string[pyarrow]
timely_response boolean
consumer_disputed boolean
complaint_id string[pyarrow]
dtype: object
DataFrame.describe()
yöntemi, DataFrame'den bazı temel istatistikleri sorgulayarak döndürür. Bu DataFrame sayısal sütun içermediğinden, boş olmayan değer sayısının ve farklı değerlerin sayısının bir özetini gösterir.
Bu hücreyi çalıştırın:
# Exclude some of the larger columns to make the query more efficient.
feedback.drop(columns=[
"consumer_complaint_narrative",
"company_public_response",
"company_response_to_consumer",
]).describe()
Beklenen çıkış:
product subproduct issue subissue company_name state ... timely_response consumer_disputed complaint_id
count 3458906 3223615 3458906 2759004 3458906 3417792 ... 3458906 768399 3458906
nunique 18 76 165 221 6694 63 ... 2 2 3458906
4. Verileri keşfetme
Gerçek şikayetleri incelemeye başlamadan önce, verileri görselleştirmek için DataFrame'deki pandas benzeri yöntemleri kullanın.
DataFrame'i görselleştirme
DataFrame.plot.hist() gibi çeşitli yerleşik görselleştirme yöntemleri vardır. Bu DataFrame çoğunlukla dize ve doğru/yanlış veriler içerdiğinden, çeşitli sütunlar hakkında daha fazla bilgi edinmek için önce bazı toplama işlemleri yapabiliriz.
Her eyaletten kaç şikayet alındığını sayın.
complaints_by_state = (
feedback.groupby(
"state", as_index=False,
).size()
.rename(columns={"size": "total_complaints"})
.sort_values(by="total_complaints", ascending=False)
)
DataFrame.to_pandas()
yöntemini kullanarak bunu bir pandas DataFrame'e dönüştürün.
complaints_pd = complaints_by_state.head(10).to_pandas()
İndirilen bu DataFrame'de pandas görselleştirme yöntemlerini kullanın.
complaints_pd.plot.bar(x="state", y="total_complaints")
Diğer veri kümeleriyle birleştirme
Daha önce, şikayetleri eyalet bazında inceliyordunuz ancak bu yöntemde önemli bağlam bilgileri kayboluyordu. Bazı eyaletlerin nüfusu diğerlerinden daha fazladır. ABD Nüfus Bürosu'nun Amerikan Topluluk Anketi ve bigquery-public-data.geo_us_boundaries.states
tablosu gibi bir nüfus veri kümesiyle birleştirin.
us_states = bpd.read_gbq("bigquery-public-data.geo_us_boundaries.states")
us_survey = bpd.read_gbq("bigquery-public-data.census_bureau_acs.state_2020_5yr")
# Ensure there are leading 0s on GEOIDs for consistency across tables.
us_states = us_states.assign(
geo_id=us_states["geo_id"].str.pad(2, fillchar="0")
)
us_survey = us_survey.assign(
geo_id=us_survey["geo_id"].str.pad(2, fillchar="0")
)
American Community Survey, eyaletleri GEOID'ye göre tanımlar. İki harfli eyalet koduna göre nüfusu almak için eyaletler tablosuyla birleştirin.
pops = us_states.set_index("geo_id")[["state"]].join(
us_survey.set_index("geo_id")[["total_pop"]]
)
Artık nüfusu şikayet sayısıyla karşılaştırmak için bunu şikayet veritabanına ekleyin.
complaints_and_pops = complaints_by_state.set_index("state").join(
pops.set_index("state")
)
Eyalet nüfuslarını şikayet sayısıyla karşılaştırmak için bir dağılım grafiği oluşturun.
(
complaints_and_pops
.to_pandas()
.plot.scatter(x="total_pop", y="total_complaints")
)
Nüfus ile şikayet sayısı karşılaştırıldığında birkaç eyalet anormal görünüyor. Bu noktaları tanımlamak için nokta etiketleriyle noktaları göstermek okuyucunun yapması gereken bir alıştırmadır. Benzer şekilde, bunun neden olabileceğine dair bazı hipotezler (ör. farklı demografi, farklı sayıda mali hizmet şirketi vb.) oluşturun ve bunları test edin.
5. Yerleştirilmiş öğeleri hesaplama
Önemli bilgiler genellikle metin, ses veya resim gibi yapılandırılmamış verilerde gizlidir. Bu örnekte, şikayet veritabanındaki yararlı bilgilerin çoğu şikayetin metin içeriğinde yer almaktadır.
Yapay zeka ve duyarlı analiz, "kelime çantası" ve word2vec gibi geleneksel teknikler, yapılandırılmamış verilerden bazı nicel bilgiler ayıklayabilir. Daha yakın zamanda, LLM'lerle yakından ilişkili olan "vektör yerleştirme" modelleri, metnin anlamsal bilgilerini temsil eden bir dizi kayan noktalı sayı oluşturabilir.
Veritabanının bir alt kümesini seçme
Bir vektör yerleştirme modelini çalıştırmak diğer işlemlere kıyasla daha fazla kaynak kullanır. Maliyetleri ve kota sorunlarını azaltmak için bu eğitimdeki geri kalan kısım için verilerin bir alt kümesini seçin.
import bigframes.pandas as bpd
bpd.options.bigquery.ordering_mode = "partial"
feedback = bpd.read_gbq(
"bigquery-public-data.cfpb_complaints.complaint_database"
)
# Note: if not using ordering_mode = "partial", you must specify these in read_gbq
# for these to affect query efficiency.
# feedback = bpd.read_gbq(
# "bigquery-public-data.cfpb_complaints.complaint_database",
# columns=["consumer_complaint_narrative"],
# filters= [
# ("consumer_complaint_narrative", "!=", ""),
# ("date_received", "==", "2022-12-01")])
feedback.shape
Toplam veritabanında yaklaşık 3,5 milyon satır olmasına karşılık 01.12.2022'de yaklaşık 1.000 şikayet gönderilmiştir (feedback.shape
ile iletişime geçin).
Yalnızca 01.12.2022 tarihli verileri ve yalnızca consumer_complaint_narrative
sütununu seçin.
import datetime
feedback = feedback[
# Filter rows by passing in a boolean Series.
(feedback["date_received"] == datetime.date(2022, 12, 1))
& ~(feedback["date_received"].isnull())
& ~(feedback["consumer_complaint_narrative"].isnull())
& (feedback["consumer_complaint_narrative"] != "")
& (feedback["state"] == "CA")
# Uncomment the following if using free credits for a workshop.
# Billing accounts with free credits have limited Vertex AI quota.
# & (feedback["product"] == "Mortgage")
][
# Filter columns by passing in a list of strings.
["consumer_complaint_narrative"]
]
feedback.shape
pandas'daki drop_duplicates
yöntemi, eşleşen ilk veya son satırı seçip onunla ilişkili dizini korumaya çalıştığından satırların toplam sıralamasını gerektirir.
Bunun yerine, satırları tekilleştirmek için groupby
yöntemini çağırarak toplayın.
feedback = (
feedback.groupby("consumer_complaint_narrative", as_index=False)
.size()
)[["consumer_complaint_narrative"]]
feedback.shape
Yerleştirilmiş öğeler oluşturma
BigQuery DataFrames, TextEmbeddingGenerator sınıfı aracılığıyla yerleştirme vektörleri oluşturur. Bu işlem, BigQuery ML'deki ML.GENERATE_EMBEDDING
yöntemine dayanır. Bu yöntem, Vertex AI tarafından sağlanan metin yerleştirme modellerini çağırır.
from bigframes.ml.llm import TextEmbeddingGenerator
embedding_model = TextEmbeddingGenerator(
model_name="text-embedding-004"
)
feedback_embeddings = embedding_model.predict(feedback)
Yerleşimlerin nasıl göründüğüne göz atın. Bu vektörler, metin yerleştirme modeli tarafından anlaşıldığı şekliyle metnin anlamsal anlamını temsil eder.
feedback_embeddings.peek()
Beklenen çıkış:
ml_generate_embedding_result \
0 [ 7.36380890e-02 2.11779331e-03 2.54309829e-...
1 [-1.10935252e-02 -5.53950183e-02 2.01338865e-...
2 [-7.85628427e-03 -5.39347418e-02 4.51385677e-...
3 [ 0.02013054 -0.0224789 -0.00164843 0.011354...
4 [-1.51684484e-03 -5.02693094e-03 1.72322839e-...
Bu vektörlerin birçok boyutu vardır. Tek bir yerleştirme vektörüne göz atın:
feedback_embeddings["ml_generate_embedding_result"].peek().iloc[0]
Yer paylaşımı oluşturma işlemi "kısmi başarı" sözleşmesi kapsamında çalışır. Bu durumda bazı satırlarda hata olabilir ve bu satırlarda yerleşim oluşturulmayabilir. Hata mesajları 'ml_generate_embedding_status'
sütununda gösterilir. Boş, hata olmadığı anlamına gelir.
Yerleşimlerini, yalnızca hata oluşmayan satırları içerecek şekilde filtreleyin.
mask = feedback_embeddings["ml_generate_embedding_status"] == ""
valid_embeddings = feedback_embeddings[mask]
valid_embeddings.shape
6. Metin gömmeleri kullanarak küme oluşturma
Ardından, k-ortalama kullanarak yerleştirmeleri kümeleyin. Bu demo için rastgele sayıda grup (diğer adıyla merkez noktası) kullanın. Prodüksiyon kalitesinde bir çözüm, Silhouette yöntemi gibi bir teknik kullanarak merkez nokta sayısını ayarlamalıdır.
from bigframes.ml.cluster import KMeans
num_clusters = 5
cluster_model = KMeans(n_clusters=num_clusters)
cluster_model.fit(valid_embeddings["ml_generate_embedding_result"])
clusters = cluster_model.predict(valid_embeddings)
clusters.peek()
Tüm yerleşik hataları kaldırın.
mask = clusters["ml_generate_embedding_status"] == ""
clusters = clusters[mask]
Orta nokta başına yorumların dağılımını inceleyin.
clusters.groupby("CENTROID_ID").size()
7. Kümeleri özetleme
Her bir merkez noktasıyla ilişkili bazı yorumlar girin ve Gemini'den şikayetleri özetlemesini isteyin. İstem mühendisliği yeni gelişen bir alandır ancak internette https://www.promptingguide.ai/ gibi iyi örnekler vardır.
from bigframes.ml.llm import GeminiTextGenerator
preamble = "What is the main concern in this list of user complaints:"
suffix = "Write the main issue using a formal tone."
# Now let's sample the raw comments and get the LLM to summarize them.
prompts = []
for centroid_id in range(1, num_clusters + 1):
cluster = clusters[clusters["CENTROID_ID"] == centroid_id]
comments = "\n".join(["- {0}".format(x) for x in cluster.content.peek(40)])
prompts.append("{}:\n{}\n{}".format(preamble, comments, suffix))
prompt_df = bpd.DataFrame(prompts)
gemini = GeminiTextGenerator(model_name="gemini-1.5-flash-001")
issues = gemini.predict(X=prompt_df, temperature=0.0)
issues.peek()
Özetlerden rapor yazmak için Gemini'yi kullanın.
from IPython.display import display, Markdown
prompt = "Turn this list of issues into a short, concise report:"
for value in issues["ml_generate_text_llm_result"]:
prompt += "- {}".format(value)
prompt += "Using a formal tone, write a markdown text format report."
summary_df = bpd.DataFrame(([prompt]))
summary = gemini.predict(X=summary_df, temperature=0.0)
report = (summary["ml_generate_text_llm_result"].values[0])
display(Markdown(report))
8. Temizleme
Bu eğitim için yeni bir Google Cloud projesi oluşturduysanız oluşturulan tablolar veya diğer kaynaklar için ek ücret alınmaması amacıyla projeyi silebilirsiniz.
9. Tebrikler!
BigQuery veri çerçevelerini kullanarak yapılandırılmış ve yapılandırılmamış verileri analiz ettiniz. Bu süreçte Google Cloud'un herkese açık veri kümelerini, BigQuery Studio'daki Python not defterlerini, BigQuery ML'yi, Vertex AI'ı ve BigQuery Studio'nun doğal dilden Python'a çeviri özelliklerini keşfettiniz. Tebrikler!
Sonraki adımlar
- Not defterinizde Python kodu oluşturmayı deneyin. BigQuery Studio'daki Python not defterleri Colab Enterprise tarafından desteklenir. İpucu: Test verileri oluşturma konusunda yardım istemenin oldukça yararlı olduğunu düşünüyorum.
- GitHub'da BigQuery veri kümeleri için örnek not defterlerini keşfedin.
- BigQuery Studio'da not defteri çalıştırmak için planlama
- Üçüncü taraf Python paketlerini BigQuery ile entegre etmek için BigQuery Veri Çerçeveleri ile Uzak İşlev dağıtın.